我将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
函数销毁密钥句柄。