C# .NET Core 256位AES加密结果异常及解密乱码问题求助
问题诱因
你当前的加解密逻辑存在3个核心错误:
- 加密方法读取密文时机错误:你在
StreamWriter刚写完字符串、还未刷新缓冲区、也未等待CryptoStream完成所有块的加密运算的情况下,就直接调用ms.ToArray()读取密文,导致读取到的密文是不完整的、未完成最终Padding填充的。 - 加解密IV处理逻辑不匹配:你在加密时主动把IV拼接到了密文的开头,但解密逻辑完全没有拆分前16字节的IV,而是直接把包含IV前缀的整个字节数组当成密文解密,相当于把前16位的IV也当成密文做了解码,自然会出现开头乱码的问题。
- 解密方法存在冗余无效代码+语法错误:解密时
string base64Decode = Encoding.UTF8.GetString(base64decodeBytes);这行代码完全无用,不仅没有任何作用,还可能在遇到非UTF8编码的字节时引发潜在的编码错误;同时原代码的catch块位置错误,不在try的作用域范围内,本身存在语法问题。
修正后的代码(兼容原有固定IV逻辑,可跨语言互通)
如果你的其他语言项目已经在使用固定IV、密文不带IV前缀的加密逻辑,直接使用以下修正后的代码即可实现互通:
加密方法
public string encrypt(string decryptedString) { byte[] key = Encoding.UTF8.GetBytes(CipherKey); using var aes = System.Security.Cryptography.Aes.Create(); aes.KeySize = 256; aes.Padding = PaddingMode.PKCS7; aes.Key = key; aes.IV = Encoding.UTF8.GetBytes(CipherIv); aes.Mode = CipherMode.CBC; ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV); using MemoryStream ms = new MemoryStream(); // 等CryptoStream、StreamWriter都完成写入释放后再读取密文 using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) { using StreamWriter sr = new StreamWriter(cs); sr.Write(decryptedString); } var encryptedBytes = ms.ToArray(); return Convert.ToBase64String(encryptedBytes); }
解密方法
public string decrypt(string encryptedPassword, bool throwException = false) { try { byte[] key = Encoding.UTF8.GetBytes(CipherKey); using var aes = System.Security.Cryptography.Aes.Create(); aes.KeySize = 256; aes.Padding = PaddingMode.PKCS7; aes.Key = key; aes.IV = Encoding.UTF8.GetBytes(CipherIv); aes.Mode = CipherMode.CBC; byte[] base64decodeBytes = Convert.FromBase64String(encryptedPassword); ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV); using MemoryStream ms = new MemoryStream(base64decodeBytes); using CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read); using StreamReader sr = new StreamReader(cs); return sr.ReadToEnd(); } catch (Exception ex) { if (throwException) throw; return encryptedPassword; } }
如果后续你想要改用更安全的随机IV方案(每个加密内容对应独立随机IV,IV拼在密文开头),只需要同步修改解密逻辑:从base64解码后的字节数组前16位读取IV,再把剩下的部分作为密文解密即可,这种方案安全性比固定IV更高,适合新业务场景使用。
内容的提问来源于stack exchange,提问作者Boardy
相关产品推荐
相关产品推荐

