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

AES解密报错:CryptographicException(待解密数据长度无效)排查

问题分析与解决方案

核心错误点

1. 密文转换与长度参数错误

你最初用Encoding.ASCII.GetBytes(CipherText)处理Base64格式的密文是完全错误的——Base64是二进制数据的文本编码,必须用Convert.FromBase64String还原为原始字节数组。更关键的是,调用TransformFinalBlock时,你传入了字符串的长度而非转换后字节数组的长度,这会导致解密时传入的字节数与实际密文字节数不匹配,触发长度无效的异常。

2. 密文与加密函数输出不匹配

你提供的密文u1jeSfKVfSRfSieLX01/uQ==转换为字节数组后长度是18字节,但你的AES加密函数(CBC模式+PKCS7填充)处理"Test"(4字节明文)时,会填充至16字节(AES块大小),生成的密文应为16字节,对应Base64字符串长度为24字符,但实际转换后字节数应为16而非18。这说明该密文并非由你当前的encrypt函数生成,可能是加密时的密钥、IV被修改,或者密文被额外拼接了其他数据。

修复后的解密函数代码

string decrypt(String CipherText)
{
    using (AesManaged aesCipher = new AesManaged())
    {
        aesCipher.KeySize = 128;
        aesCipher.BlockSize = 128;
        aesCipher.Mode = CipherMode.CBC;
        aesCipher.Padding = PaddingMode.PKCS7;
        byte[] key = generatedKey();
        aesCipher.Key = key;

        byte[] iv = new byte[16];
        // 15 1B 0F 03 56 3A 66 6D E5 E1 1D 83 12 21 B4 8E
        iv[0] = 0x15;
        iv[1] = 0x1B;
        iv[2] = 0x0F;
        iv[3] = 0x03;
        iv[4] = 0x56;
        iv[5] = 0x3A;
        iv[6] = 0x66;
        iv[7] = 0x6D;
        iv[8] = 0xE5;
        iv[9] = 0xE1;
        iv[10] = 0x1D;
        iv[11] = 0x83;
        iv[12] = 0x12;
        iv[13] = 0x21;
        iv[14] = 0xB4;
        iv[15] = 0x8E;

        aesCipher.IV = iv;
        System.Console.WriteLine("IV:" + Convert.ToBase64String(aesCipher.IV));

        ICryptoTransform decryptTransform = aesCipher.CreateDecryptor(aesCipher.Key, aesCipher.IV);
        // 正确转换密文并使用字节数组长度
        byte[] cipherBytes = Convert.FromBase64String(CipherText);
        byte[] plainText = decryptTransform.TransformFinalBlock(cipherBytes, 0, cipherBytes.Length);
        return System.Text.Encoding.UTF8.GetString(plainText);
    }
}

额外验证步骤

  1. 确认密钥一致性:运行encrypt函数时,控制台会输出密钥的Base64字符串,解密时也输出该字符串,确保两者完全一致(generatedKey函数参数固定,理论上每次生成的密钥应相同)。
  2. 重新生成密文:调用encrypt("Test")获取正确的密文,用该密文测试解密函数,确认是否能正常解密出"Test"。
  3. 资源释放优化:所有实现IDisposable的加密类(如AesManaged、Rfc2898DeriveBytes)都应用using语句包裹,避免资源泄漏。

内容的提问来源于stack exchange,提问作者Divesh Bari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 00:36:27