.Net Core 实现与 CryptoJS.AES.encrypt 等效加密功能咨询
等效CryptoJS AES加密的.NET Core实现方案
你更新后的代码还存在三处核心问题导致加密结果不一致,修正方案如下:
问题原因
- 未显式指定AES加密参数,不同运行环境的默认配置可能存在差异
- 用
StreamWriter直接写入字符串时,默认UTF8编码可能携带BOM头,和CryptoJS直接将字符串转UTF8字节的逻辑不匹配 - 未校验密钥、IV长度是否符合128位AES的要求(需各占16字节)
修正后可直接使用的代码
using System.Security.Cryptography; using System.Text; public string RequestHash(string text, string keyString, string ivString) { // 转换密钥和IV为UTF8字节,确保长度符合128位AES要求 byte[] key = Encoding.UTF8.GetBytes(keyString); byte[] iv = Encoding.UTF8.GetBytes(ivString); if (key.Length != 16) throw new ArgumentException("密钥必须为16位字符(UTF8编码后16字节,对应128位密钥长度)"); if (iv.Length != 16) throw new ArgumentException("IV必须为16位字符(UTF8编码后16字节)"); using (Aes aesAlg = Aes.Create()) { // 显式指定和JS侧完全一致的配置:CBC模式、Pkcs7填充 aesAlg.Mode = CipherMode.CBC; aesAlg.Padding = PaddingMode.PKCS7; aesAlg.Key = key; aesAlg.IV = iv; // 直接将明文转UTF8字节写入加密流,避免BOM问题 using (ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV)) using (MemoryStream msEncrypt = new MemoryStream()) using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) { byte[] plainTextBytes = Encoding.UTF8.GetBytes(text); csEncrypt.Write(plainTextBytes, 0, plainTextBytes.Length); csEncrypt.FlushFinalBlock(); byte[] encryptedBytes = msEncrypt.ToArray(); // 直接返回密文Base64编码,和CryptoJS.encrypt.toString()结果一致 return Convert.ToBase64String(encryptedBytes); } } }
调用时注意事项
- JS侧的
key1和C#侧的keyString必须完全一致,长度为16个字符 - JS侧的
key2和C#侧的ivString必须完全一致,长度为16个字符 - C#侧传入的
text参数必须等于JS侧myData.substr(0, myData.length - 1)的处理结果,两边输入文本完全一致才能得到相同的加密输出
内容的提问来源于stack exchange,提问作者Naveed Ahmed
相关产品推荐
相关产品推荐

