You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# .NET Core 256位AES加密结果异常及解密乱码问题求助

问题诱因

你当前的加解密逻辑存在3个核心错误:

  1. 加密方法读取密文时机错误:你在StreamWriter刚写完字符串、还未刷新缓冲区、也未等待CryptoStream完成所有块的加密运算的情况下,就直接调用ms.ToArray()读取密文,导致读取到的密文是不完整的、未完成最终Padding填充的。
  2. 加解密IV处理逻辑不匹配:你在加密时主动把IV拼接到了密文的开头,但解密逻辑完全没有拆分前16字节的IV,而是直接把包含IV前缀的整个字节数组当成密文解密,相当于把前16位的IV也当成密文做了解码,自然会出现开头乱码的问题。
  3. 解密方法存在冗余无效代码+语法错误:解密时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:27:04