我正在使用 Wincrypt for Diffie-Hellman——我可以以纯文本形式导出共享密钥吗?

发布于 2024-07-06 01:27:17 字数 511 浏览 10 评论 0原文

好的 - 感谢 Mike,我能够让 Wincrypt 生成 Diffie-Hellman 密钥对。 我想出了导出公钥,以及如何导入对方的公钥。 根据文档,导入对方的公钥后,就计算出了共享秘密。 伟大的。

我现在需要掌握这个共同的秘密,但我认为这是不可能的。 仅使用 PLAINTEXTKEYBLOB 类型调用 CryptExportKey 会失败,除非我调用 CryptSetKeyParam 将算法 ID 从 CALG_AGREEDKEY_ANY 更改为其他值... 别的。 但我不想要别的东西,我想要共享的秘密。 然而,API 似乎旨在阻止这种情况发生。

有什么想法吗? 我应该指出,这里的问题是我只编写了 WiFi 保护设置实现的一方面。 所以协议是为我定义的,而对方没有给我 HCRYPTKEY。

OK-- thanks to Mike, I was able to get Wincrypt to generate a Diffie-Hellman keypair. I figured out out to export the public key, and how to import the other party's public key. According to the docs, upon import of the other party's public key, the shared secret has been computed. Great.

I now need to get ahold of that shared secret, but I don't think its possible. Simply calling CryptExportKey with a type of PLAINTEXTKEYBLOB fails unless I call CryptSetKeyParam to change the algorithm id from CALG_AGREEDKEY_ANY to something... else. But I don't want something else, I want the shared secret. The API, however, seems designed to discourage this.

Any ideas out there? I should note that the problem here is that I'm only writing one side of an implementation of WiFi Protected Setup. So the protocol is defined for me, and the other party is not giving me HCRYPTKEYs.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

甜警司 2024-07-13 01:27:17

这看起来像你所需要的......
来自: http://msdn.microsoft.com/en -us/library/aa381969(VS.85).aspx


导入 Diffie-Hellman 公钥并计算秘密会话密钥

  1. 调用 CryptAcquireContext 函数获取 Microsoft Diffie 的句柄-Hellman 加密提供商。
  2. 通过调用 CryptGenKey 函数创建新密钥,或调用 CryptGetUserKey 函数检索现有密钥来创建 Diffie-Hellman 密钥。
  3. 要将 Diffie-Hellman 公钥导入到 CSP 中,请调用 CryptImportKey 函数,在 pbData 参数中传递指向公钥 BLOB 的指针,BLOB 的长度为dwDataLen 参数,以及 hPubKey 参数中 Diffie-Hellman 密钥的句柄。 这会导致执行计算(Y^X) mod P,从而创建共享密钥并完成密钥交换。 此函数调用返回 hKey 参数中新的秘密会话密钥的句柄。
  4. 此时,导入的 Diffie-Hellman 类型为 CALG_AGREEDKEY_ANY。 在使用密钥之前,必须将其转换为会话密钥类型。 这是通过调用 CryptSetKeyParam 函数并将 dwParam 设置为 KP_ALGID 并将 pbData 设置为指向表示会话密钥的 ALG_ID 值,例如 CALG_RC4。 在 CryptEncryptCryptDecrypt 函数中使用共享密钥之前,必须先转换密钥。 在转换密钥类型之前对这些函数中的任何一个进行的调用都会失败。
  5. 秘密会话密钥现在已准备好用于加密或解密。
  6. 当不再需要密钥时,通过调用CryptDestroyKey函数销毁密钥句柄。

This looks like what you need...
from: http://msdn.microsoft.com/en-us/library/aa381969(VS.85).aspx


To import a Diffie-Hellman public key and calculate the secret session key

  1. Call the CryptAcquireContext function to get a handle to the Microsoft Diffie-Hellman Cryptographic Provider.
  2. Create a Diffie-Hellman key by calling the CryptGenKey function to create a new key, or by calling the CryptGetUserKey function to retrieve an existing key.
  3. To import the Diffie-Hellman public key into the CSP, call the CryptImportKey function, passing a pointer to the public key BLOB in the pbData parameter, the length of the BLOB in the dwDataLen parameter, and the handle to the Diffie-Hellman key in the hPubKey parameter. This causes the calculation, (Y^X) mod P, to be performed, thus creating the shared, secret key and completing the key exchange. This function call returns a handle to the new, secret, session key in the hKey parameter.
  4. At this point, the imported Diffie-Hellman is of type CALG_AGREEDKEY_ANY. Before the key can be used, it must be converted into a session key type. This is accomplished by calling the CryptSetKeyParam function with dwParam set to KP_ALGID and with pbData set to a pointer to a ALG_ID value that represents a session key, such as CALG_RC4. The key must be converted before using the shared key in the CryptEncrypt or CryptDecrypt function. Calls made to either of these functions prior to converting the key type will fail.
  5. The secret session key is now ready to be used for encryption or decryption.
  6. When the key is no longer needed, destroy the key handle by calling the CryptDestroyKey function.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文