使用TripleDESCryptoServiceProvider解密每次结果不一致,求问题排查
3DES解密结果每次运行不一致的问题排查
我正在测试3DES加密解密功能,编写了如下简单标准的代码,但每次运行TripleDESDecryption函数时,得到的decryptedData输出结果都不相同。请帮忙指出问题所在?
private void TripleDESDecryption() { TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider(); des.Key = new byte[] { 0x26, 0x01, 0x54, 0xd0, 0xdc, 0x92, 0xf3, 0x4b, 0xbf, 0x9b, 0xfa, 0x9d, 0x43, 0x24, 0x4b, 0xa4, 0x35, 0x50, 0xde, 0x00, 0x5e, 0x75, 0xc7, 0xed }; des.KeySize = 192; des.Mode = CipherMode.ECB; des.Padding = PaddingMode.None; ICryptoTransform ic = des.CreateDecryptor(); var encryptedData = new byte[] { 0x35, 0x66, 0x45, 0xC4, 0xBD, 0xE9, 0x5F, 0x30 }; byte[] decryptedData = ic.TransformFinalBlock(encryptedData, 0, 8); Console.WriteLine(BitConverter.ToString(decryptedData)); }
注:以上均为随机生成的密钥和数据,无敏感信息。
问题原因
问题出在你设置的密钥不符合3DES的密钥校验规则。
3DES的192位密钥由三个64位子密钥组成,默认情况下TripleDESCryptoServiceProvider只允许两种合法密钥格式:
- 2-key模式:第三个64位子密钥必须和第一个完全相同
- 3-key模式:三个64位子密钥都不同,但需要显式启用强加密支持
你提供的24字节密钥中,第一个8字节和第三个8字节既不相同,也没有启用3-key模式的强加密,此时组件会静默生成随机密钥替代非法密钥,这就是每次解密结果不同的核心原因。
解决办法
有两种可行的修复方案:
方案一:使用2-key模式
修改密钥,让第三个8字节和第一个完全一致,示例密钥如下:des.Key = new byte[] { 0x26, 0x01, 0x54, 0xd0, 0xdc, 0x92, 0xf3, 0x4b, 0xbf, 0x9b, 0xfa, 0x9d, 0x43, 0x24, 0x4b, 0xa4, 0x26, 0x01, 0x54, 0xd0, 0xdc, 0x92, 0xf3, 0x4b };方案二:启用3-key模式(.NET Framework适用)
在设置密钥前添加UseStrongEncryption属性配置,允许使用三个不同的子密钥:des.UseStrongEncryption = true; des.Key = new byte[] { 0x26, 0x01, 0x54, 0xd0, 0xdc, 0x92, 0xf3, 0x4b, 0xbf, 0x9b, 0xfa, 0x9d, 0x43, 0x24, 0x4b, 0xa4, 0x35, 0x50, 0xde, 0x00, 0x5e, 0x75, 0xc7, 0xed };
额外提示
TripleDESCryptoServiceProvider的静默替换行为比较隐蔽,建议改用更现代的加密API(如Aes类),或者使用TripleDES.Create()创建实例,这些方式会对非法密钥抛出明确的异常,便于快速排查问题。
内容的提问来源于stack exchange,提问作者Ryan B.
相关产品推荐
相关产品推荐

