好的-感谢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。在使用密钥之前,必须将其转换为会话密钥类型。这是通过在dwParam设置为KP_ALGID并将pbData设置为指向表示会话密钥的ALG_ID值的指针(例如CALG_RC4)的指针的情况下调用CryptSetKeyParam函数来实现的。在CryptEncrypt或CryptDecrypt函数中使用共享密钥之前,必须先转换密钥。在转换密钥类型之前,对这些函数之一的调用将失败。
现在可以将秘密会话密钥用于加密或解密。
当不再需要密钥时,通过调用CryptDestroyKey函数销毁密钥句柄。