AES加密CBC模式下Java和C#互转
C#加解密工具类代码
class JdAesCBCTool { public static string Encrypt(string toEncrypt, string key, string iv) { byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key); byte[] ivArray = UTF8Encoding.UTF8.GetBytes(iv); byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt); RijndaelManaged rDel = new RijndaelManaged(); rDel.Key = keyArray; rDel.IV = ivArray; rDel.Mode = CipherMode.CBC; rDel.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = rDel.CreateEncryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); //return Convert.ToBase64String(resultArray, 0, resultArray.Length); return ToHexString(resultArray); } public static string Decrypt(string toDecrypt, string key, string iv) { byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key); byte[] ivArray = UTF8Encoding.UTF8.GetBytes(iv); byte[] toEncryptArray = ConvertHexStringToBytes(toDecrypt); RijndaelManaged rDel = new RijndaelManaged(); rDel.Key = keyArray; rDel.IV = ivArray; rDel.Mode = CipherMode.CBC; rDel.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = rDel.CreateDecryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return UTF8Encoding.UTF8.GetString(resultArray); } public static string ToHexString(byte[] bytes) // 0xae00cf => "AE00CF " { string hexString = string.Empty; if (bytes != null) { StringBuilder strB = new StringBuilder(); for (int i = 0; i < bytes.Length; i++) { strB.Append(bytes[i].ToString("x2")); } hexString = strB.ToString(); } return hexString; } /// <summary> /// 16进制原码字符串转字节数组 /// </summary> /// <param name="hexString">"AABBCC"或"AA BB CC"格式的字符串</param> /// <returns></returns> public static byte[] ConvertHexStringToBytes(string hexString) { hexString = hexString.Trim(); if (hexString.Length % 2 != 0) { throw new ArgumentException("参数长度不正确"); } byte[] returnBytes = new byte[hexString.Length / 2]; for (int i = 0; i < returnBytes.Length; i++) { returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); } return returnBytes; } }
Java加解密工具类代码
import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.DecoderException; import org.apache.commons.codec.binary.Hex; public class AesUtil { private static final String CHARSET_NAME = "UTF-8"; private static final String INSTANCE_NAME = "AES/CBC/PKCS5Padding"; private static final String ENCRYPT_METHOD = "AES"; public static String decrypt(String str, String key, String ivStr) { try { if (str != null && str.trim().length() >= 1) { SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES"); IvParameterSpec iv = new IvParameterSpec(ivStr.getBytes()); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(2, skeySpec, iv); byte[] encrypted = decodeHex(str); byte[] original = cipher.doFinal(encrypted); return new String(original, "UTF-8"); } } catch (Exception e) { e.printStackTrace(); } return null; } public static String encrypt(String str, String key, String ivStr) { try { if (str != null && str.trim().length() >= 1) { SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES"); IvParameterSpec iv = new IvParameterSpec(ivStr.getBytes()); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(1, skeySpec, iv); byte[] encrypted = str.getBytes("UTF-8"); byte[] original = cipher.doFinal(encrypted); String originalString = encodeHex(original); return originalString; } } catch (Exception e) { e.printStackTrace(); } return null; } public static String encodeHex(byte[] input) { return Hex.encodeHexString(input); } public static byte[] decodeHex(String input) { try { return Hex.decodeHex(input.toCharArray()); } catch (DecoderException e) { e.printStackTrace(); return null; } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?