Blazor WASM与ASP.NET Core API AES加解密:解密结果乱码前缀问题排查
AES解密结果前出现乱码问题
我在Blazor WASM中使用以下JavaScript代码做AES加密:
function encrypt(plainText, key) { debugger; const iv = CryptoJS.lib.WordArray.random(16); const keyBytes = CryptoJS.enc.Utf8.parse(key); const encrypted = CryptoJS.AES.encrypt(plainText, keyBytes, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); const encryptedText = iv.concat(encrypted.ciphertext).toString(CryptoJS.enc.Base64); return encryptedText; }
在ASP.NET Core API中用以下C#代码解密:
public string Decrypt(string cipherText, string key) { try { var iv = new byte[16]; var buffer = Convert.FromBase64String(cipherText); using (Aes aes = Aes.Create()) { aes.Key = Encoding.UTF8.GetBytes(key); aes.IV = iv; aes.Padding = PaddingMode.PKCS7; ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV); using (MemoryStream ms = new MemoryStream(buffer)) { using (CryptoStream cryptoStream = new CryptoStream(ms, decryptor, CryptoStreamMode.Read)) { using (StreamReader sr = new StreamReader(cryptoStream)) { var result = sr.ReadToEnd(); return result; } } } } } catch (Exception e) { throw; } }
双方使用相同密钥:private const string INITIAL_KEY = @"mPqqfIRf74nIJiO4";。解密能得到目标内容,但结果前会出现不可读乱码,比如客户端明文是encryptedMessage,服务端解密后显示为���������|����^encryptedMessage,请问哪里操作错误?
错误原因
你的C#解密代码没有正确提取IV:
- JS加密时,是将16字节的IV和密文拼接后转成Base64返回的
- 但C#代码里直接用了空的
new byte[16]作为IV,没有从解密的buffer中分离出前16字节的IV,导致解密时用了错误的IV,进而让密文开头部分解密乱码,后面内容因对齐巧合能正确解密。
修复后的C#解密代码
public string Decrypt(string cipherText, string key) { try { var buffer = Convert.FromBase64String(cipherText); // 从buffer中提取前16字节作为IV var iv = buffer.Take(16).ToArray(); // 剩下的部分才是真正的密文 var cipherBytes = buffer.Skip(16).ToArray(); using (Aes aes = Aes.Create()) { aes.Key = Encoding.UTF8.GetBytes(key); aes.IV = iv; aes.Padding = PaddingMode.PKCS7; ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV); // 使用密文字节数组创建MemoryStream,而不是整个buffer using (MemoryStream ms = new MemoryStream(cipherBytes)) { using (CryptoStream cryptoStream = new CryptoStream(ms, decryptor, CryptoStreamMode.Read)) { using (StreamReader sr = new StreamReader(cryptoStream)) { return sr.ReadToEnd(); } } } } } catch (Exception e) { throw; } }
内容的提问来源于stack exchange,提问作者Ibanez1408
相关产品推荐
相关产品推荐

