我正在使用.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); }
抛出一个例外
System.Security.Cryptography.CryptographicException : Specified key is a known weak key for 'TripleDES' and cannot be used.
我知道这不是一个安全的密钥.在生产中,设备将使用新的安全密钥进行闪存.同时,有没有办法抑制这个异常被抛出?也许是一个app.config
或注册表设置?
编辑:密钥实际上是101010 ...由于算法强制奇校验.我不确定这是DES算法的通用性还是我付款处理工作的要求.
编辑2:Daniel的答案下面有一些关于黑客.NET的非常好的信息.不幸的是,我无法使用这种技术解决我的问题,但仍然有一些有趣的阅读.
我不会真的推荐它,但你应该能够使用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.
我放弃.我希望有人能够回答到底是怎么回事,因为我肯定不知道.:)