代码之家  ›  专栏  ›  技术社区  ›  Scott Saad

如何在.NET应用程序中使用Win32 CryptoAPI生成的密钥blob?

  •  2
  • Scott Saad  · 技术社区  · 16 年前

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

    问题是我们如何在.NET应用程序(C#)中使用它。该框架封装/包装了CryptoAPI的大部分功能。问题的一部分是CryptoAPI声明了 Microsoft Enhanced Cryptographic Provider

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

    更新:

    2 回复  |  直到 15 年前
        1
  •  5
  •   Community CDub    8 年前

    简介

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

    先决条件

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

    Microsoft Enhanced Cryptographic Provider ,带有三个DES( CALG_3DES )算法。让我陷入循环的第一件事是,密钥长度为168位,块长度为64位。密钥长度如何为168?三把56位的钥匙?另一个字节发生了什么?

    NET中密钥的使用

    TripleDESCryptoServiceProvider ,我注意到文件中的备注表明:

    我很困惑 .

    F

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

    灯泡和焰火

    CryptExportKey 作用低看,我发现这条信息是无效的:

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

    算法支持的密钥大小

    计算64位

    计算128位

    计算192位

    .NET导入代码调整

    在导入包含从CryptoAPI导出为blob的密钥的字节流时,必须记住字节顺序。因此,这两个API不使用相同的字节顺序 @nic-strong 指示在实际尝试使用密钥之前必须反转字节数组。除此之外,一切正常。简单解决:

    Array.Reverse( keyByteArray );
    

        2
  •  1
  •   Nic Strong    16 年前

    好吧,忘了我读不懂的最后一个答案:)你使用的是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。我记得在第一次解决问题时是不明显的。

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