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

使用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只允许两种合法密钥格式:

  1. 2-key模式:第三个64位子密钥必须和第一个完全相同
  2. 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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:45:33