TripleDES:指定密钥是'TripleDES'的已知弱密钥,无法使用

Dav*_*lle 12 .net c# cryptography cryptographicexception

我正在使用.NET 3.0类System.Security.Cryptography.MACTripleDES类来生成MAC值.不幸的是,我正在使用一个使用" 1111111111111111"(作为十六进制)作为单长DES密钥的硬件设备.System.Security.Cryptography如果您尝试使用加密弱键,库会对键执行一些完整性检查并返回异常.

例如:

byte[] key = new byte[24];
for (int i = 0; i < key.Length; i++)
  key[i] = 0x11;

byte[] data = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
byte[] computedMac = null;
using (MACTripleDES mac = new MACTripleDES(key))
{
  computedMac = mac.ComputeHash(data);
}
Run Code Online (Sandbox Code Playgroud)

抛出一个例外

System.Security.Cryptography.CryptographicException : Specified key is a known weak key for 'TripleDES' and cannot be used.
Run Code Online (Sandbox Code Playgroud)

我知道这不是一个安全的密钥.在生产中,设备将使用新的安全密钥进行闪存.同时,有没有办法抑制这个异常被抛出?也许是一个app.config或注册表设置?

编辑:密钥实际上是101010 ...由于算法强制奇校验.我不确定这是DES算法的通用性还是我付款处理工作的要求.

编辑2:Daniel的答案下面有一些关于黑客.NET的非常好的信息.不幸的是,我无法使用这种技术解决我的问题,但仍然有一些有趣的阅读.

Dan*_*oof 6

我不会真的推荐它,但你应该能够使用Reflector和Add-in ReflexIL修改检查弱键的IL代码

编辑:

对不起,我需要一段时间才能在我的虚拟机(运行Ubuntu)中加载所有内容并且不想弄乱Mono.

  • 安装ReflexIL加载项:视图 - >加载项 - >添加
  • 打开ReflexIL:工具 - > ReflexIL v0.9
  • 找到IsWeakKey()函数.(您可以使用搜索:F3)
  • 将出现两个函数,双击System.Security.Cryptography.TripleDES中找到的函数
  • ReflexIL也应该出现.在"说明"选项卡中,一直向下滚动到第29行(偏移63).
  • 将ldc.i4.1更改为ldc.i4.0,这意味着该函数将始终返回false.

在程序集窗格(左侧)中,您现在可以向上滚动并单击"公共语言运行库",ReflexIL窗格将为您提供保存它的选项.

重要笔记:

  • 首先备份原始组件!(mscorlib.dll中)
  • mscorlib.dll是一个已签名的程序集,您需要使用.NET SDK(sn.exe工具)来使ReflexIL跳过验证.我自己检查过这个,你应该已经安装了Visual C#.当被要求时,只需点击"注册它以进行验证跳过(在此计算机上)".
  • 我不认为我必须告诉你只在开发机器上使用它:)

祝好运!如果您需要其他说明,请随时使用评论框.

EDIT2:

我糊涂了!

http://i44.tinypic.com/2r6fwbo_th.png

我完全从mscorlib程序集中的set_Key函数中删除了IsWeakKey检查.我绝对肯定我修改了正确的功能,并且我做得正确.Reflector的反汇编程序不再显示检查.然而,有趣的是,Visual C#仍然会抛出相同的异常.

这让我相信mscorlib必须以某种方式仍然在某处缓存.但是,将mscorlib.dll重命名为mscorlib.dll_导致MSVC#崩溃,因此它仍必须依赖于原始dll.

这是非常有趣的东西,但我想我已经达到了一点,我不知道发生了什么,它只是没有任何意义!见附图.:(

EDIT3:

我在Olly注意到,与mscoree,mscorsec和mscorwks等组件不同; mscorlib.dll实际上不在:c:\ WINDOWS\Microsoft.NET\Framework\v2.0.50727 \

但相反,在看起来不存在的位置:C:\ WINDOWS\assembly\NativeImages_v2.0.50727_32\mscorlib\6d667f19d687361886990f3ca0f49816\mscorlib.ni.dll

我想我在这里遗漏了一些东西:)将对此进行更多研究.

edit4:

即使在已经修补了一切IsWeakKey,以及带移除,并产生新的原生图像周围播放(X.NI使用"ngen.exe" .DLL)的mscorlib.dll的,我收到了同样的异常.我必须注意,即使在卸载本机mscorlib映像后,它仍然使用mscorlib.ni.dll ... Meh.

我放弃.我希望有人能够回答到底是怎么回事,因为我肯定不知道.:)


Ras*_*ber 1

您可以在DESCryptoServiceProvider之上自行实现 CBC-MAC,而不是使用 MACTripleDES 和重复的 DES 密钥来伪造单个 DES CBC-MAC 。

<1111111111111111> 不是弱 DES 密钥。

这将计算 DES CBC-MAC:

public static byte[] CalcDesMac(byte[] key, byte[] data){
        DESCryptoServiceProvider des = new DESCryptoServiceProvider();
        des.Key = key;
        des.IV = new byte[8];
        des.Padding = PaddingMode.Zeros;
        MemoryStream ms = new MemoryStream();
        using(CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write)){
          cs.Write(data, 0, data.Length);
        }
        byte[] encryption = ms.ToArray();
        byte[] mac = new byte[8];
        Array.Copy(encryption, encryption.Length-8, mac, 0, 8);
        PrintByteArray(encryption);
        return mac;
    }
Run Code Online (Sandbox Code Playgroud)