c# AES加密解密
本人因为近期对接java的项目,遇到一些问题,明明java那边是标准的AES加密,但是就是c#解密不了,网上找了好几个在线解密也解密不了,只知道一个可以在线解密成功的,可惜没有代码例子提供。
最后让他提供java代码例子,调式才知道原来C#中的byte和Java中的byte取值范围不一样,Java中的取值范围为-128~127,C#中取值范围为0~255,所以加密的时候,我把加密出来的结果转成十六进制,结果就好了
//16位密钥 string key = "abcdefghijklmnop"; string json = "{\"userName\":\"wind追光者\",\"age\":\"18\"}"; //AES加密 string sign = json.AESEncrypt(key); //AES解密 string jsonStr = sign.AESDecrypt(key);
AESHelper
public static class Aes128Helper { /// <summary> /// AES 加密 /// </summary> /// <param name="str">明文(待加密)</param> /// <returns></returns> public static string AESEncrypt(this string str,string aesSecretKey) { try { if (string.IsNullOrEmpty(str)) return null; byte[] toEncryptArray = Encoding.UTF8.GetBytes(str); byte[] keyArray = UTF8Encoding.UTF8.GetBytes(aesSecretKey); RijndaelManaged rm = new RijndaelManaged { Key = keyArray, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 }; ICryptoTransform cTransform = rm.CreateEncryptor(); Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); string strs = ""; for (var x = 0; x < resultArray.Length; x++) { var i = Convert.ToString(resultArray[x], 16); strs += i.PadLeft(2, '0'); } return strs; } catch (Exception ex) { return ""; } } /// <summary> /// AES 解密 /// </summary> /// <param name="str">密文(待解密)</param> /// <returns></returns> public static string AESDecrypt(this string str,string aesSecretKey) { try { if (string.IsNullOrEmpty(str)) return null; byte[] keyArray = UTF8Encoding.UTF8.GetBytes(aesSecretKey); byte[] toEncryptArray = new byte[str.Length / 2]; for (var x = 0; x < toEncryptArray.Length; x++) { var i = Convert.ToInt32(str.Substring(x * 2, 2), 16); toEncryptArray[x] = (byte)i; } RijndaelManaged rDel = new RijndaelManaged(); rDel.Key = keyArray; rDel.Mode = CipherMode.ECB; rDel.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = rDel.CreateDecryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return UTF8Encoding.UTF8.GetString(resultArray); } catch (Exception ex) { return ""; } } }
此处AES并不是标准AES加密,把转十六进制去掉才是AES,本文只是记录踩坑!!!