AES加密报CryptographicException:密钥长度无效,求排查错误原因
问题分析与解决:AES密钥长度不符合要求异常
你遇到的System.Security.Cryptography.CryptographicException: '指定的密钥不符合该算法的有效长度。'异常,核心问题出在密钥的转换逻辑上,咱们来拆解一下:
问题根源
你定义的key是一个64字符的十六进制字符串,而256位AES要求的密钥是**32字节(256位)**的二进制数据。但你用ASCIIEncoding.ASCII.GetBytes(key)转换时,会把每个字符(比如'd'、'7')都单独转成一个ASCII字节,64个字符就变成了64字节——这显然超出了256位AES的密钥长度要求,所以抛出了异常。
修正方案
需要把十六进制字符串直接解析成对应的二进制字节数组,而不是按ASCII编码转换。这里提供两种实现方式:
方式1:自定义辅助方法转换
string key = "d771815a7f74ebfaa2d44f8b7654fa19e7a02452c2ab351d222e49297910a814"; AesCryptoServiceProvider aes = new AesCryptoServiceProvider(); aes.Padding = PaddingMode.None; aes.Mode = CipherMode.ECB; aes.BlockSize = 128; aes.KeySize = 256; // 将十六进制字符串转为32字节的密钥 aes.Key = HexStringToByteArray(key); // 辅助方法:十六进制字符串转字节数组 private static byte[] HexStringToByteArray(string hex) { if (hex.Length % 2 != 0) throw new ArgumentException("十六进制字符串长度必须是偶数"); byte[] result = new byte[hex.Length / 2]; for (int i = 0; i < hex.Length; i += 2) { result[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16); } return result; }
方式2:使用.NET内置方法(.NET 5+)
如果你的项目基于.NET 5或更高版本,可以直接用Convert.FromHexString简化转换:
string key = "d771815a7f74ebfaa2d44f8b7654fa19e7a02452c2ab351d222e49297910a814"; AesCryptoServiceProvider aes = new AesCryptoServiceProvider(); aes.Padding = PaddingMode.None; aes.Mode = CipherMode.ECB; aes.BlockSize = 128; aes.KeySize = 256; // 直接用内置方法转换十六进制字符串 aes.Key = Convert.FromHexString(key);
额外建议
- 过时API替换:
AesCryptoServiceProvider在.NET Core和.NET 5+中已被标记为过时,推荐使用更通用的Aes.Create()来创建AES实例,兼容性更好:using Aes aes = Aes.Create(); aes.Padding = PaddingMode.None; aes.Mode = CipherMode.ECB; aes.BlockSize = 128; aes.KeySize = 256; aes.Key = Convert.FromHexString(key); - 加密模式安全性:ECB模式是不安全的加密模式(相同明文会生成相同密文,容易被破解),除非有特殊的兼容需求,否则建议使用CBC、GCM等更安全的模式,同时记得使用随机初始化向量(IV)。
内容的提问来源于stack exchange,提问作者BHNHAT
相关产品推荐
相关产品推荐

