请求将指定C# AES加密函数转换为等效JavaScript代码
把C# AES加密函数转换为JavaScript版本
原C#加密函数
C#代码实际使用AES-CBC算法,密钥为Base64格式,IV是16字节全0数组,明文以UTF-8编码加密,最终输出Base64格式密文:
using System.IO; using System; using System.Security.Cryptography; using System.Text; class Program { static void Main() { string sonuc = OpenSSLEncryptApi("plainText","GSTEGSTEjdfheyhdHSHSHSHDHHDHmdjjdn12ndndn5r="); Console.WriteLine(sonuc); } public static string OpenSSLEncryptApi(string plainText, string apikey) { byte[] iv = new byte[16]; // 16字节全0数组 byte[] array; using (Aes aes = Aes.Create()) { aes.Key = Convert.FromBase64String(apikey); // 密钥Base64解码 aes.IV = iv; ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV); using (MemoryStream memoryStream = new MemoryStream()) { using (CryptoStream cryptoStream = new CryptoStream((Stream)memoryStream, encryptor, CryptoStreamMode.Write)) { using (StreamWriter streamWriter = new StreamWriter((Stream)cryptoStream)) { streamWriter.Write(plainText); // 默认UTF-8编码写入明文 } array = memoryStream.ToArray(); } } } return Convert.ToBase64String(array); } }
初始尝试的JavaScript代码
最初错误使用TripleDES算法,且密钥处理逻辑不符合C#逻辑:
var text = 'plainText'; var key = "GSTEGSTEjdfheyhdHSHSHSHDHHDHmdjjdn12ndndn5r="; key = CryptoJS.enc.Utf16LE.parse(key); //key = CryptoJS.dec.Base64.parse(key); key = CryptoJS.MD5(key) key.words.push(key.words[0], key.words[1]); //var options = {mode: CryptoJS.mode.ECB};//CBC var options = {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7}; var textWordArray = CryptoJS.enc.Utf16LE.parse(text); var encrypted = CryptoJS.TripleDES.encrypt(textWordArray, key,options); var base64String = encrypted.toString() console.Log(base64String);
修改后的JavaScript代码(仍有问题)
改为AES算法,但IV处理错误(用字符串解析而非全0字节数组):
function aesEncrypt (data) { const key = 'GSTEGSTEjdfheyhdHSHSHSHDHHDHmdjjdn12ndndn5r='; const iv = '0000000000000000'; const cipher = CryptoJS.AES.encrypt(data, CryptoJS.enc.Utf8.parse(key), { iv: CryptoJS.enc.Utf8.parse(iv), // parse the IV padding: CryptoJS.pad.Pkcs7, mode: CryptoJS.mode.CBC }) // e.g. B6AeMHPHkEe7/KHsZ6TW/Q== return cipher.toString() }
正确的JavaScript实现
要和C#结果一致,需严格匹配以下关键点:
- 密钥:对Base64格式的密钥解码,而非直接解析为UTF-8
- IV:生成16字节全0数组(对应C#的
new byte[16]) - 明文:使用UTF-8编码(C# StreamWriter默认编码)
- 算法:AES-CBC + PKCS7填充
正确代码如下:
function aesEncrypt(plainText, apiKey) { // 解码Base64格式的密钥 const key = CryptoJS.enc.Base64.parse(apiKey); // 生成16字节全0的IV const iv = CryptoJS.lib.WordArray.create(16); // 用UTF-8编码明文 const textWordArray = CryptoJS.enc.Utf8.parse(plainText); // AES-CBC加密,PKCS7填充 const encrypted = CryptoJS.AES.encrypt(textWordArray, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); // 返回Base64格式密文 return encrypted.toString(); } // 测试示例 const result = aesEncrypt('plainText', 'GSTEGSTEjdfheyhdHSHSHSHDHHDHmdjjdn12ndndn5r='); console.log(result); // 输出与C#版本一致的密文
内容的提问来源于stack exchange,提问作者Nuri Erginer
相关产品推荐
相关产品推荐

