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的非常好的信息.不幸的是,我无法使用这种技术解决我的问题,但仍然有一些有趣的阅读.
我不会真的推荐它,但你应该能够使用Reflector和Add-in ReflexIL修改检查弱键的IL代码
编辑:
对不起,我需要一段时间才能在我的虚拟机(运行Ubuntu)中加载所有内容并且不想弄乱Mono.
在程序集窗格(左侧)中,您现在可以向上滚动并单击"公共语言运行库",ReflexIL窗格将为您提供保存它的选项.
重要笔记:
祝好运!如果您需要其他说明,请随时使用评论框.
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.
我放弃.我希望有人能够回答到底是怎么回事,因为我肯定不知道.:)
您可以在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)