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,本文只是記錄踩坑!!!
