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

好的 – 感谢
Mike,我能够让Wincrypt生成一个Diffie-Hellman密钥对.我想出了导出公钥,以及如何导入对方的公钥.根据文档,在导入另一方的公钥时,已经计算了共享秘密.大.

我现在需要了解这个共同的秘密,但我不认为这是可能的.只是使用PLAINTEXTKEYBLOB类型调用CryptExportKey失败,除非我调用CryptSetKeyParam将算法ID从CALG_AGREEDKEY_ANY更改为…… else.但我不想要别的东西,我想要共享的秘密.然而,API似乎旨在阻止这一点.

有什么想法吗?我应该注意到这里的问题是我只写了WiFi保护设置实现的一面.所以协议是为我定义的,另一方不给我HCRYPTKEYs.

最佳答案 这看起来像你需要的……

来自:
http://msdn.microsoft.com/en-us/library/aa381969(VS.85).aspx

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

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

点赞