gpt4 book ai didi

.net - 如何在我的 .NET 应用程序中使用从 Win32 CryptoAPI 生成的 key blob?

转载 作者:搜寻专家 更新时间:2023-10-31 00:24:25 25 4
gpt4 key购买 nike

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

问题是我们如何在 .NET 应用程序 (C#) 中使用它。该框架封装/包装了 CryptoAPI 所做的大部分工作。部分问题是 CryptAPI 指出 Microsoft Enhanced Cryptographic Provider 的 TripleDES 算法是 168 位(56 位的 3 个 key )。但是,.NET 框架声明它们的 key 是 192 位(3 个 64 位 key )。看样子,.NET framework 多出 3 个字节是为了校验?

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

更新:

我一直在研究解决这个问题的方法,并提出了一个我会及时发布的解决方案。但是,仍然感谢其他人的任何反馈。

最佳答案

简介

我终于抽出时间来发布解决方案了。我希望它能为可能正在做类似事情的其他人提供一些帮助。确实没有太多关于在其他地方执行此操作的引用。

先决条件

为了使其中的很多内容有意义,有必要阅读 exponent of one trick ,它允许您将 session key 导出到 blob(一种众所周知的字节结构)。然后人们可以用这个字节流做他们想做的事,但它拥有所有重要的 key 。

MSDN 文档令人困惑

在这个特定的例子中,我使用了 Microsoft Enhanced Cryptographic Provider , 使用三重 DES ( CALG_3DES ) 算法。让我陷入循环的第一件事是 key 长度为 168 位, block 长度为 64 位。 key 长度怎么可能是168呢? 56位的三个 key ?另一个字节会发生什么?

因此,有了这些信息,我开始在其他地方阅读最后一个字节是如何真正奇偶校验的,并且无论出于何种原因,CryptoAPI 都会将其删除。真的是这样吗?他们会那样做似乎有点疯狂,但没关系。

.NET 中 key 的使用

使用 TripleDESCryptoServiceProvider ,我注意到文档中的注释表明:

This algorithm supports key lengths from 128 bits to 192 bits in increments of 64 bits.

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

因此,对于所有这些,我试图弄清楚如何使用正确的奇偶校验信息在 .NET 端重建 key 。可行,但不是很有趣……让我们就此打住吧。一旦我将所有这些都准备就绪,一切都以 CAPITAL F 告终。

还在我身边吗?很好,因为我又掉马了。

灯泡和烟花

瞧,当我在 MSDN 上搜索每一个信息时,我在 Win32 CryptExportKey 中发现了一个冲突的部分。功能。瞧,我发现了这条宝贵的信息:

For any of the DES key permutations that use a PLAINTEXTKEYBLOB, only the full key size, including parity bit, may be exported. The following key sizes are supported.

Algorithm Supported key size

CALG_DES 64 bits

CALG_3DES_112 128 bits

CALG_3DES 192 bits

所以它导出的 key 是 64 位的倍数!哇哦!现在修复 .NET 端的代码。

.NET 导入代码调整

在导入包含从 CryptoAPI 作为 blob 导出的 key 的字节流时,请务必牢记字节顺序。这两个 API 不使用相同的字节顺序,因此,如 @nic-strong表明,在实际尝试使用 key 之前反转字节数组是必不可少的。除此之外,一切都按预期工作。简单解决:

Array.Reverse( keyByteArray );

结论

我希望这对那里的人有所帮助。我花了太多时间试图追踪这个。如果您还有其他问题,请留下任何评论,我可以尝试帮助填写任何详细信息。

加密货币快乐!

关于.net - 如何在我的 .NET 应用程序中使用从 Win32 CryptoAPI 生成的 key blob?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com