CryptoJS與C#AES加解密互轉
阿新 • • 發佈:2018-12-14
頁面js引用:
<script type="text/javascript" src="/content/plugin/CryptoJSv3.1.2/components/core-min.js"></script>
<script type="text/javascript" src="/content/plugin/CryptoJSv3.1.2/rollups/aes.js"></script>
JS端AES加密解密:
/************************************************************** *字串加密 * str:需要加密的字串 ****************************************************************/ function Encrypt(str) { var KEY = "12345678900000001234567890000000";//32位 var IV = "1234567890000000";//16位 var key = CryptoJS.enc.Utf8.parse(KEY); var iv = CryptoJS.enc.Utf8.parse(IV); var encrypted = ''; var srcs = CryptoJS.enc.Utf8.parse(str); encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); return encrypted.ciphertext.toString(); } /************************************************************** *字串解密 * str:需要解密的字串 ****************************************************************/ function Decrypt(str) { var KEY = "12345678900000001234567890000000";//32位 var IV = "1234567890000000";//16位 var key = CryptoJS.enc.Utf8.parse(KEY); var iv = CryptoJS.enc.Utf8.parse(IV); var encryptedHexStr = CryptoJS.enc.Hex.parse(str); var srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr); var decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8); return decryptedStr.toString(); }
C# AES加密解密:
const string AES_IV = "1234567890000000";//16位 /// <summary> /// AES加密演算法 /// </summary> /// <param name="input">明文字串</param> /// <param name="key">金鑰(32位)</param> /// <returns>字串</returns> public static string EncryptByAES(string input, string key) { byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 32)); using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider()) { aesAlg.Key = keyBytes; aesAlg.IV = Encoding.UTF8.GetBytes(AES_IV.Substring(0, 16)); ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); using (MemoryStream msEncrypt = new MemoryStream()) { using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) { using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) { swEncrypt.Write(input); } byte[] bytes = msEncrypt.ToArray(); return ByteArrayToHexString(bytes); } } } } /// <summary> /// AES解密 /// </summary> /// <param name="input">密文位元組陣列</param> /// <param name="key">金鑰(32位)</param> /// <returns>返回解密後的字串</returns> public static string DecryptByAES(string input, string key) { byte[] inputBytes = HexStringToByteArray(input); byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 32)); using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider()) { aesAlg.Key = keyBytes; aesAlg.IV = Encoding.UTF8.GetBytes(AES_IV.Substring(0, 16)); ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); using (MemoryStream msEncrypt = new MemoryStream(inputBytes)) { using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, decryptor, CryptoStreamMode.Read)) { using (StreamReader srEncrypt = new StreamReader(csEncrypt)) { return srEncrypt.ReadToEnd(); } } } } } /// <summary> /// 將指定的16進位制字串轉換為byte陣列 /// </summary> /// <param name="s">16進位制字串(如:“7F 2C 4A”或“7F2C4A”都可以)</param> /// <returns>16進位制字串對應的byte陣列</returns> public static byte[] HexStringToByteArray(string s) { s = s.Replace(" ", ""); byte[] buffer = new byte[s.Length / 2]; for (int i = 0; i < s.Length; i += 2) buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16); return buffer; } /// <summary> /// 將一個byte陣列轉換成一個格式化的16進位制字串 /// </summary> /// <param name="data">byte陣列</param> /// <returns>格式化的16進位制字串</returns> public static string ByteArrayToHexString(byte[] data) { StringBuilder sb = new StringBuilder(data.Length * 3); foreach (byte b in data) { //16進位制數字 sb.Append(Convert.ToString(b, 16).PadLeft(2, '0')); //16進位制數字之間以空格隔開 //sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' ')); } return sb.ToString().ToUpper(); }
用法:
Encrypt("2017-05")//結果:68f4a7903a9fe6085d2301ac68cc039c Decrypt("68f4a7903a9fe6085d2301ac68cc039c")//結果:2017-05
//加密 string str1 = Encrypt.EncryptByAES("2017-05", "12345678900000001234567890000000"); //解密 string str2 = Encrypt.DecryptByAES("68f4a7903a9fe6085d2301ac68cc039c", "12345678900000001234567890000000");