我正在使用 Wincrypt for Diffie-Hellman——我可以以纯文本形式导出共享密钥吗?
好的 - 感谢 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这看起来像你所需要的......
来自: http://msdn.microsoft.com/en -us/library/aa381969(VS.85).aspx
导入 Diffie-Hellman 公钥并计算秘密会话密钥
CryptAcquireContext
函数获取 Microsoft Diffie 的句柄-Hellman 加密提供商。CryptGenKey
函数创建新密钥,或调用CryptGetUserKey
函数检索现有密钥来创建 Diffie-Hellman 密钥。CryptImportKey
函数,在pbData
参数中传递指向公钥 BLOB 的指针,BLOB 的长度为dwDataLen
参数,以及hPubKey
参数中 Diffie-Hellman 密钥的句柄。 这会导致执行计算(Y^X) mod P
,从而创建共享密钥并完成密钥交换。 此函数调用返回hKey
参数中新的秘密会话密钥的句柄。CALG_AGREEDKEY_ANY
。 在使用密钥之前,必须将其转换为会话密钥类型。 这是通过调用CryptSetKeyParam
函数并将dwParam
设置为KP_ALGID
并将pbData
设置为指向表示会话密钥的ALG_ID
值,例如CALG_RC4
。 在CryptEncrypt
或CryptDecrypt
函数中使用共享密钥之前,必须先转换密钥。 在转换密钥类型之前对这些函数中的任何一个进行的调用都会失败。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
CryptAcquireContext
function to get a handle to the Microsoft Diffie-Hellman Cryptographic Provider.CryptGenKey
function to create a new key, or by calling theCryptGetUserKey
function to retrieve an existing key.CryptImportKey
function, passing a pointer to the public key BLOB in thepbData
parameter, the length of the BLOB in thedwDataLen
parameter, and the handle to the Diffie-Hellman key in thehPubKey
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 thehKey
parameter.CALG_AGREEDKEY_ANY
. Before the key can be used, it must be converted into a session key type. This is accomplished by calling theCryptSetKeyParam
function withdwParam
set toKP_ALGID
and withpbData
set to a pointer to aALG_ID
value that represents a session key, such asCALG_RC4
. The key must be converted before using the shared key in theCryptEncrypt
orCryptDecrypt
function. Calls made to either of these functions prior to converting the key type will fail.CryptDestroyKey
function.