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

.NET Core中AES加解密填充无效无法移除问题及AES256配置咨询

.NET Core中AES加解密填充无效无法移除问题及AES256配置咨询

你好!咱们一步步拆解并解决你的问题:

一、解密时填充错误的原因及修复

你的核心问题出在DecryptString方法的密文截取逻辑上——你固定把cipher数组设为16字节,但加密后的密文长度并不一定是16字节!

原代码里这两行是错误的:

var cipher = new byte[16];
Buffer.BlockCopy(fullCipher, iv.Length, cipher, 0, iv.Length);

这里你只截取了fullCipher中从IV长度开始的16字节,但实际密文长度应该是fullCipher.Length - iv.Length,正确写法应该是:

var cipher = new byte[fullCipher.Length - iv.Length];
Buffer.BlockCopy(fullCipher, iv.Length, cipher, 0, cipher.Length);

这样才能完整获取所有加密内容,解密时就不会出现填充错误了。

二、配置AES256的方法

要强制使用AES256,需要显式设置关键参数,同时确保密钥长度符合要求:

  • KeySize=256:AES256要求密钥为256位(即32字节),你的密钥"E546C8DF278CD5931069B522E695D4F2"刚好是32个UTF8字符,编码后正好是32字节,符合要求。
  • 显式指定加密模式(如CBC,虽为默认值但显式设置更清晰)和填充模式(PKCS7,默认值但显式设置更安全)

修改后的完整加解密方法如下:

加密方法(AES256版本)

public static string EncryptString(string text, string keyString)
{
    var key = Encoding.UTF8.GetBytes(keyString);
    // 验证密钥长度是否符合AES256要求
    if (key.Length != 32)
        throw new ArgumentException("AES256 requires a 32-byte key.", nameof(keyString));

    using (var aesAlg = Aes.Create())
    {
        // 显式配置AES256参数
        aesAlg.KeySize = 256;
        aesAlg.Mode = CipherMode.CBC;
        aesAlg.Padding = PaddingMode.PKCS7;
        aesAlg.Key = key;
        // 自动生成随机IV(AES要求每次加密使用不同的IV)
        aesAlg.GenerateIV();

        using (var encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV))
        using (var msEncrypt = new MemoryStream())
        {
            // 先写入IV,再写入加密后的内容
            msEncrypt.Write(aesAlg.IV, 0, aesAlg.IV.Length);
            using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            using (var swEncrypt = new StreamWriter(csEncrypt))
            {
                swEncrypt.Write(text);
            }

            return Convert.ToBase64String(msEncrypt.ToArray());
        }
    }
}

解密方法(AES256版本)

public static string DecryptString(string cipherText, string keyString)
{
    var fullCipher = Convert.FromBase64String(cipherText);
    var key = Encoding.UTF8.GetBytes(keyString);
    // 验证密钥长度
    if (key.Length != 32)
        throw new ArgumentException("AES256 requires a 32-byte key.", nameof(keyString));

    // 提取IV(AES的IV固定为16字节)
    var iv = new byte[16];
    Buffer.BlockCopy(fullCipher, 0, iv, 0, iv.Length);
    // 提取完整的密文
    var cipher = new byte[fullCipher.Length - iv.Length];
    Buffer.BlockCopy(fullCipher, iv.Length, cipher, 0, cipher.Length);

    using (var aesAlg = Aes.Create())
    {
        aesAlg.KeySize = 256;
        aesAlg.Mode = CipherMode.CBC;
        aesAlg.Padding = PaddingMode.PKCS7;
        aesAlg.Key = key;
        aesAlg.IV = iv;

        using (var decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV))
        using (var msDecrypt = new MemoryStream(cipher))
        using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
        using (var srDecrypt = new StreamReader(csDecrypt))
        {
            return srDecrypt.ReadToEnd();
        }
    }
}

额外注意事项

  • 不要硬编码密钥:生产环境中,密钥绝对不能直接写在代码里,应该使用Azure Key Vault、AWS KMS这类安全密钥管理服务,或者Windows DPAPI等本地密钥存储方案。
  • IV的作用:IV是初始化向量,每次加密都要使用新的随机值,你的原代码已经做到了这一点,这是正确的——IV不需要保密,只要和密文一起传输/存储即可。

备注:内容来源于stack exchange,提问作者DRapp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 09:19:33