我有一个现有的应用程序,是用C++编写的。这个应用程序使用Win32CryptoAPI产生的TripleDES届会议钥匙加密/解密数据。我们使用 指数的一招 出口届会议的关键作为一个blob,它允许blob要存储的地方在解密的格式。

问题是我们如何可以使用这在我们的。网应用程序(C#)。该框架封装/卷饼什么的CryptoAPI是这样做的。一部分问题是CryptAPI国家的TripleDES算法 Microsoft增强了密码提供者 168位(3个关键的56位)。然而,中。网框架内国其键192位(3个关键的64位)。显然,3个额外的字节。净框架是为奇偶校验?

无论如何,我们需要读的关键部分的斑点并以某种方式能够使用,在我们的。净的应用程序。目前我们没有获得预期的结果时,尝试使用的关键。网。解密失败得很惨。任何帮助,将不胜感激。

更新:

我已经工作的方式解决此问题和已经想出了一个解决方案,我将发布时间。但是,仍然会感谢任何的反馈他人。

有帮助吗?

解决方案

介绍

我最后得到公布的解决方案。我希望它提供了一些帮助他人,可能会做类似的东西。是不是真的有很多参考这样做的其他地方。

先决条件

为了这一切意义,它就是需要读的 指数的一招, ,允许你出一届会议关键的出blob(一个众所周知字节的结构)。一个可以然后做什么他们希望与这个字节流,但它拥有的所有重要的关键。

MSDN文件是混乱的

在这个特定例子中,我在使用 Microsoft增强了密码提供者, ,与三DES(CALG_3DES)的算法。第一件事丢给我一个循环是一个事实,即关键的长度是列在168位,用一块长的64位。怎么可能密钥的长度以168?三个关键的56位?发生了什么其它字节?

因此与这些信息我开始阅读其他地方如何最后一个字节是真的很奇偶校验并为任何原因CryptoAPI条,关闭。是真的吗?似乎有点疯狂,他们会这么做,但确定。

消耗的关键。净

使用 TripleDESCryptoServiceProvider, 我注意到了言论在文件指出:

这个算法的支持密钥长度从128位的192位的增量的64位。

因此,如果CryptoAPI有密钥长度为168,我将如何得到这。净支持仅支持的倍数的64?因此,中。净侧API需要奇偶校验考虑在内,在那里CryptoAPI不。作为一个可以想象... 迷惑我.

所有这一切,我试图找出如何重建的关键。净面有适当的奇偶校验的信息。可行的,但不是非常有趣的...让我们留在那里。一旦我得到了所有这些在地方,一切都结束了未用资金 F.

仍然有我的吗?很好因为我只是摔下我的马了。

灯泡和烟花

低见,因为我刮MSDN为每一位信息,我找到一个相互矛盾的片在Win32 CryptExportKey 功能。低看我找到这片invaluble信息:

对于任何DES关键排列,使用一个PLAINTEXTKEYBLOB,只有全的关键尺寸,包括校验位,可以出口。以下关键尺寸的支持。

算法支持的关键尺寸

CALG_DES64位

CALG_3DES_112 128位

CALG_3DES192位

因此,它不出口的一个关键,是一个多的64位!呜呼!现在要解决的代码。净面。

.净进口码的调整

字节的顺序,重要的是要记住,当进口字节流,其中包含一个关键出口为blob从CryptoAPI。两个API不使用相同的字节的顺序,因此,作为 @nic-强 表明,扭转字阵列是必不可少的前实际使用的关键。此外,工作如预期的那样。简单的解决:

Array.Reverse( keyByteArray );

结论

我希望这可以帮助别人在那里。我花了太多时间试图追踪这个下来。离开任何评论,如果你有进一步的问题,我可以尝试帮助填补任何细节。

快乐的密码!

其他提示

好吧,忘了最后的答案我不能读取:)你的工作与3Des键不RSA密匙。

我曾在一堆的代码分享键之间。净,CryptoAPI和openssl。找到了很多很好的例子在这里的代码这样做的关键的转换:

http://www.jensign.com/JavaScience/cryptoutils/index.html

有一些3des的东西中的一些例子,但它是有关openssl->.净请参考.

我也只是回顾过RSA密码和一件事我注意到我在做的是使用数组。反()所有关键零部件RSA密匙(D、DP,DQ,InverseQ,模、P、Q)我想转换端。我记得在非显而易见,当第一次处理该问题。

希望一些帮助。好运气。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top