![]() |
1
5
简介我终于开始发布解决方案了。我希望它能为其他可能做类似事情的人提供一些帮助。在其他地方这样做确实没有太多的参考。 先决条件为了让这些有意义,有必要阅读 exponent of one trick ,它允许您将会话密钥导出到blob(一种众所周知的字节结构)。然后,人们可以用这个字节流做他们想做的事情,但它掌握着最重要的关键。 Microsoft Enhanced Cryptographic Provider ,带有三个DES( CALG_3DES )算法。让我陷入循环的第一件事是,密钥长度为168位,块长度为64位。密钥长度如何为168?三把56位的钥匙?另一个字节发生了什么?
NET中密钥的使用TripleDESCryptoServiceProvider ,我注意到文件中的备注表明: 我很困惑 . F 还和我在一起吗?很好,因为我又从马上摔下来了。 灯泡和焰火CryptExportKey 作用低看,我发现这条信息是无效的:
.NET导入代码调整在导入包含从CryptoAPI导出为blob的密钥的字节流时,必须记住字节顺序。因此,这两个API不使用相同的字节顺序 @nic-strong 指示在实际尝试使用密钥之前必须反转字节数组。除此之外,一切正常。简单解决:
|
![]() |
2
1
好吧,忘了我读不懂的最后一个答案:)你使用的是3Des密钥而不是RSA密钥。 我编写了一系列代码来在.NET、CryptoAPI和openssl之间共享密钥。在这里找到了许多用于执行密钥转换的好示例代码: http://www.jensign.com/JavaScience/cryptoutils/index.html 其中一些示例中有一些3des内容,但它与openssl相关->。净iirc。 我还回顾了RSA密钥代码,我注意到我正在做的一件事是在RSA密钥的所有关键部分(D,DP,DQ,InverseQ,module,P,Q)上使用Array.Reverse()来转换endian。我记得在第一次解决问题时是不明显的。 希望这能有所帮助。祝你好运 |