如何在.NET应用程序中使用Win32 CryptoAPI生成的密钥blob? 我有一个用C++编写的Windows应用程序。此应用程序使用Win32 CryptoAPI生成用于加密/解密数据的TripleDES会话密钥。我们使用将会话密钥导出为blob,这允许blob以解密格式存储在某处

如何在.NET应用程序中使用Win32 CryptoAPI生成的密钥blob? 我有一个用C++编写的Windows应用程序。此应用程序使用Win32 CryptoAPI生成用于加密/解密数据的TripleDES会话密钥。我们使用将会话密钥导出为blob,这允许blob以解密格式存储在某处,.net,c++,encryption,cryptography,cryptoapi,.net,C++,Encryption,Cryptography,Cryptoapi,问题是我们如何在.NET应用程序(C#)中使用它。该框架封装/包装了CryptoAPI的大部分功能。问题的一部分在于CryptAPI声明,用于的TripleDES算法为168位(3个56位的密钥)。然而,.NET framework声明它们的密钥是192位(3个64位的密钥)。显然,.NET framework中的3个额外字节用于奇偶校验 无论如何,我们需要从blob中读取关键部分,并以某种方式在.NET应用程序中使用它。目前,我们在尝试使用.NET中的密钥时没有得到预期的结果。解密失败得很惨。

问题是我们如何在.NET应用程序(C#)中使用它。该框架封装/包装了CryptoAPI的大部分功能。问题的一部分在于CryptAPI声明,用于的TripleDES算法为168位(3个56位的密钥)。然而,.NET framework声明它们的密钥是192位(3个64位的密钥)。显然,.NET framework中的3个额外字节用于奇偶校验

无论如何,我们需要从blob中读取关键部分,并以某种方式在.NET应用程序中使用它。目前,我们在尝试使用.NET中的密钥时没有得到预期的结果。解密失败得很惨。任何帮助都将不胜感激

更新:
我一直在研究解决这个问题的方法,并提出了一个解决方案,我将及时发布。不过,如果您能从其他人那里得到任何反馈,我们还是会非常感激的。

好的,忘记我读不懂的最后一个答案:)您使用的是3Des密钥,而不是RSA密钥

我编写了一系列代码来在.NET、CryptoAPI和openssl之间共享密钥。在这里找到了许多用于执行密钥转换的好示例代码:

在一些例子中有一些3des的东西,但它与openssl->.NETIIRC有关

我还回顾了RSA密钥代码,我注意到我正在做的一件事是在RSA密钥的所有关键部分(D,DP,DQ,InverseQ,module,p,Q)上使用Array.Reverse()来转换endian。我记得在第一次解决问题时是不明显的

希望这能有所帮助。祝你好运。

介绍 我终于开始发布解决方案了。我希望它能为其他可能做类似事情的人提供一些帮助。在其他地方这样做确实没有太多的参考

先决条件 为了让这些都有意义,有必要读取,它允许您将会话密钥导出到blob(一种众所周知的字节结构)。然后,人们可以用这个字节流做他们想做的事情,但它掌握着最重要的关键

MSDN文档令人困惑 在这个特定的示例中,我使用了,和Triple-DES()算法。让我陷入循环的第一件事是,密钥长度为168位,块长度为64位。密钥长度如何为168?三把56位的钥匙?另一个字节发生了什么

因此,有了这些信息,我开始在别处阅读最后一个字节是如何真正实现奇偶校验的,以及出于何种原因CryptoAPI将其去掉。真的是这样吗?他们这么做似乎有点疯狂,但没关系

NET中密钥的使用 通过使用,我注意到文件中的备注表明:

该算法支持从128位到192位的密钥长度,增量为64位

所以,如果CryptoAPI的密钥长度为168,我将如何将其输入到只支持64倍数的.NET中?因此,API的.NET端会考虑奇偶校验,而CryptoAPI则不会。可以想象。。。我很困惑

因此,通过所有这些,我试图找出如何使用正确的奇偶校验信息在.NET端重建密钥。可行,但不是很有趣。。。就这样吧。一旦我把所有这些都准备好了,一切都以一个大写的F而告终

还和我在一起吗?很好,因为我又从马上摔下来了

灯泡和焰火 瞧,当我在抓取MSDN中的每一点信息时,我在Win32函数中发现了一个相互冲突的部分。低看,我发现这条信息是无效的:

对于使用PLAINTEXTKEYBLOB的任何DES密钥置换,只能导出完整密钥大小,包括奇偶校验位。支持以下密钥大小

算法支持的密钥大小

计算64位

计算128位

计算192位

所以它确实导出了一个64位的倍数的密钥!呜呼!现在修复.NET端的代码

.NET导入代码调整 在导入包含从CryptoAPI导出为blob的密钥的字节流时,必须记住字节顺序。这两个API不使用相同的字节顺序,因此,如图所示,在实际尝试使用密钥之前,反转字节数组是至关重要的。除此之外,一切正常。简单解决:

Array.Reverse( keyByteArray );
结论 我希望这能帮助其他人。我花了太多时间来追查这件事。如果您还有其他问题,请留下任何意见,我可以尝试帮助您填写任何详细信息

快乐加密