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

时间:2008-09-17 21:09:43

标签: cryptography cryptoapi diffie-hellman

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

我现在需要了解这个共同的秘密,但我认为不可能。除非我致电CryptExportKey将算法ID从PLAINTEXTKEYBLOB更改为其他内容,否则只需使用CryptSetKeyParam类型调用CALG_AGREEDKEY_ANY即会失败。但我不想想要别的东西,我想要共享的秘密。然而,API似乎旨在阻止这种情况。

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

1 个答案:

答案 0 :(得分:2)

这看起来像你需要的...... 来自: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,dwDataLen中BLOB的长度1}}参数,以及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函数销毁密钥句柄。