TripleDES:Thespecifiedkeyisaknownweakkeyof'TripleDES'andcannotbeused我正在使用.NET3.0类System.Security.Cryptography.MACTripleDES类生成MAC值。不幸的是,我使用的硬件设备使用“1111111111111111”(十六进制)作为单一长度的DES密钥。System.Security.Cryptography库对密钥进行一些健全性检查,如果您尝试使用密码强度较弱的密钥,则返回异常。例如:byte[]key=newbyte[24];对于(inti=0;i不是弱DES密钥。这将计算DESCBC-MAC:publicstaticbyte[]CalcDesMac(byte[]key,byte[]data){DESCryptoServiceProviderdes=newDESCryptoServiceProvider();des.Key=键;des.IV=新字节[8];des.Padding=PaddingMode.Zeros;MemoryStreamms=newMemoryStream();使用(CryptoStreamcs=newCryptoStream(ms,des.CreateEncryptor(),CryptoStreamMode.Write)){cs.Write(data,0,data.Length);}byte[]加密=ms.ToArray();byte[]mac=newbyte[8];Array.Copy(加密,encryption.Length-8,mac,0,8);PrintByteArray(加密);返回mac;我不会真的推荐它,但你应该能够使用Reflector和Add-inReflexIL来修改检查弱键的IL代码Ubuntu)并且不想弄乱Mono。在装配窗格(左侧)中,您现在可以向上滚动并单击“CommonLanguageRuntime”,ReflexIL窗格将为您提供保存选项。重要提示:祝你好运!如果您需要更多说明,请随时使用评论框。EDIT2:我很困惑!http://sofzh.miximages.com/c%23/2r6fwbo_th.png我从mscorlib程序集中的set_Key函数中完全删除了IsWeakKey检查。我绝对确定我修改了正确的功能,而且我做对了。Reflector的反汇编程序不再显示检查。然而,有趣的是,VisualC#仍然抛出相同的异常。这使我相信mscorlib仍必须以某种方式缓存在某个地方。但是,将mscorlib.dll重命名为mscorlib.dll_会使MSVC#崩溃,因此它仍然必须依赖于原始dll。这是非常有趣的事情,但我认为我已经到了不知道发生了什么的地步,这没有任何意义!见附件。EDIT3:我在Olly中注意到,与mscoree、mscorsec和mscorwks等组件不同;mscorlib.dll实际上并不在:c:\WINDOWS\Microsoft.NETFrameworkv2.0.50727,而是在似乎不存在的地方:C:\WINDOWSassemblyNativeImages_v2.0.50727_32mscorlib6d667f19d687361886990f3ca0f49816mscorlib.ni.dll我想我'我在这里遗漏了一些东西:)将对此进行更多调查。edit4:即使修复了IsWeakKey中的所有内容,并使用“ngen.exe”删除并生成了mscorlib.dll的新本机映像(x.ni.dll),我也遇到了同样的异常。我必须注意,即使在卸载本机mscorlib映像后,它仍然使用mscorlib.ni.dll...嗯。我放弃。我希望有人能回答到底发生了什么,因为我确实不知道。?我找到了你需要做的。幸运的是,有一种方法可以创建不检查弱密钥的ICryptoTranform。您还需要注意基类,因为它也会进行健全性检查。只需通过反射调用_NewEncryptor方法(您需要进行一些反射,但就是这样)。幸运的是,MACTripleDES有一个TripleDES类型的字段,因此从MACTripleDES派生并在构造函数中通过反射替换它。我为你做了所有的工作。我无法验证是否生成了正确的MAC,但没有抛出异常。此外,您可能希望对代码进行文档注释并进行异常处理(反射失败——例如,如果字段/方法不存在)——但这是SO;所以我没有打扰。使用System.Reflection;使用System.Security.Cryptography;使用System.IO;namespaceDesHack{classProgram{staticvoidMain(string[]args){byte[]key=newbyte[24];for(inti=0;i不幸的是,这种行为不能被覆盖。在MSDN论坛中有一个很好的建议使用反射我不是安全专家,但不要将你的密钥与另一个值进行异或来满足完整性检查?您可以为您的调试版本(使用正确的IFDEF)执行此操作,以便您可以正确检查并删除它以用于您的发布或生产版本,其中密钥足够强。基于反射的解决方案可以解决问题,但它们是肮脏和邪恶。还没有人提到一个非常有用的方法:TripleDES.IsWeakKey我遇到了这个问题并使用一个非常简单的实用程序解决了它,我在CryptoServiceProvider上使用它之前立即使用密钥:privatevoidMakeSecureKey(byte[]key){while(TripleDES.IsWeakKey(key)){varsha=SHA256Managed.Create().ComputeHash(key);Array.Copy(sha,key,key.Length);}}如果你在做一个加密器或解密器,它应该防止崩溃并始终为您提供安全密钥。非常简单(阅读GitHub上的代码后)staticboolTripleDES.IsWeakKey(Byte[]rgbKey)因为它是静态的-很容易测试你的密钥大小必须是16或24字节(???)为什么他们不能把它放进去文档代码检查一些简单的重复项,只是创建足够的随机值,请参阅以下代码:https://github.com/mono/mono/blob/master/mcs/class/corlib/System.Security.Cryptography/TripleDES。上面的csDecker是C#学习教程:TripleDES:Thespecifiedkeyisaknownweakkeyof'TripleDES',所有分享的内容都不能使用。如果对大家有用,需要了解更多C#学习教程,希望大家多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: