好的 - 感谢Mike,我能够让Wincrypt生成一个Diffie-Hellman密钥对。我想出了导出公钥,以及如何导入对方的公钥。根据文档,在导入另一方的公钥时,已经计算了共享秘密。大。
我现在需要了解这个共同的秘密,但我认为不可能。除非我致电CryptExportKey
将算法ID从PLAINTEXTKEYBLOB
更改为其他内容,否则只需使用CryptSetKeyParam
类型调用CALG_AGREEDKEY_ANY
即会失败。但我不想想要别的东西,我想要共享的秘密。然而,API似乎旨在阻止这种情况。
有什么想法吗?我应该注意到这里的问题是我只写了WiFi保护设置实现的一面。所以协议是为我定义的,而另一方则没有给我HCRYPTKEY。
答案 0 :(得分:2)
这看起来像你需要的...... 来自:http://msdn.microsoft.com/en-us/library/aa381969(VS.85).aspx
导入Diffie-Hellman公钥并计算秘密会话密钥
CryptAcquireContext
函数以获取Microsoft Diffie-Hellman加密提供程序的句柄。CryptGenKey
函数创建一个新密钥,或通过调用CryptGetUserKey
函数来检索现有密钥来创建Diffie-Hellman密钥。CryptImportKey
函数,将指针传递给pbData
参数中的公钥BLOB,dwDataLen
中BLOB的长度1}}参数,以及hPubKey
参数中Diffie-Hellman键的句柄。这导致执行计算(Y^X) mod P
,从而创建共享密钥并完成密钥交换。此函数调用返回hKey
参数中新的秘密会话密钥的句柄。CALG_AGREEDKEY_ANY
类型。在可以使用密钥之前,必须将其转换为会话密钥类型。这是通过调用CryptSetKeyParam
函数并将dwParam
设置为KP_ALGID
并将pbData
设置为指向代表会话密钥的ALG_ID
值的指针来实现的,例如CALG_RC4
。在使用CryptEncrypt
或CryptDecrypt
函数中的共享密钥之前,必须转换密钥。在转换密钥类型之前对这些功能之一进行的调用将失败。CryptDestroyKey
函数销毁密钥句柄。