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); } }
额外验证步骤
- 确认密钥一致性:运行
encrypt函数时,控制台会输出密钥的Base64字符串,解密时也输出该字符串,确保两者完全一致(generatedKey函数参数固定,理论上每次生成的密钥应相同)。 - 重新生成密文:调用
encrypt("Test")获取正确的密文,用该密文测试解密函数,确认是否能正常解密出"Test"。 - 资源释放优化:所有实现
IDisposable的加密类(如AesManaged、Rfc2898DeriveBytes)都应用using语句包裹,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Divesh Bari
相关产品推荐
相关产品推荐

