我将Wincrypt用于Diffie-Hellman,可以将共享密钥导出为纯文本格式吗?

时间:2020-03-05 19:00:03  来源:igfitidea点击:

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

我现在需要掌握这个共享的秘密,但我认为这是不可能的。除非我调用CryptSetKeyParam将算法ID从" CALG_AGREEDKEY_ANY"更改为其他内容,否则简单地调用类型为" PLAINTEXTKEYBLOB"的" CryptExportKey"就会失败。但是我不想要其他东西,我想要共享的秘密。但是,API似乎旨在阻止这种情况。

有什么想法吗?我应该注意,这里的问题是我只写了WiFi Protected Setup实施的一侧。因此,该协议是为我定义的,并且另一方没有给我HCRYPTKEY。

解决方案

回答

这看起来像我们所需要的...
来自:http://msdn.microsoft.com/zh-cn/library/aa381969(VS.85).aspx

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

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