Cryptography I';我正在使用Wincrypt for Diffie Hellman--我可以以明文形式导出共享秘密吗?

Cryptography I';我正在使用Wincrypt for Diffie Hellman--我可以以明文形式导出共享秘密吗?,cryptography,cryptoapi,diffie-hellman,Cryptography,Cryptoapi,Diffie Hellman,好的——多亏了,我才能够让Wincrypt生成Diffie-Hellman密钥对。我找到了导出公钥的方法,以及如何导入另一方的公钥。根据文档,在导入另一方的公钥时,已计算出共享密钥。太好了 我现在需要知道这个共同的秘密,但我认为这是不可能的。除非我调用CryptSetKeyParam将算法id从CALG\u AGREEDKEY\u ANY更改为某物,否则使用PLAINTEXTKEYBLOB类型简单调用CryptExportKey将失败。。。其他的但我不想要别的,我想要共享的秘密。然而,API似乎

好的——多亏了,我才能够让Wincrypt生成Diffie-Hellman密钥对。我找到了导出公钥的方法,以及如何导入另一方的公钥。根据文档,在导入另一方的公钥时,已计算出共享密钥。太好了

我现在需要知道这个共同的秘密,但我认为这是不可能的。除非我调用
CryptSetKeyParam
将算法id从
CALG\u AGREEDKEY\u ANY
更改为某物,否则使用
PLAINTEXTKEYBLOB
类型简单调用
CryptExportKey
将失败。。。其他的但我不想要别的,我想要共享的秘密。然而,API似乎旨在阻止这种情况


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

这看起来像是您需要的… 发件人:


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

  • 调用
    CryptAcquireContext
    函数获取Microsoft Diffie-Hellman加密提供程序的句柄
  • 通过调用
    cryptgenekey
    函数来创建新密钥,或者通过调用
    CryptGetUserKey
    函数来检索现有密钥,来创建Diffie-Hellman密钥
  • 要将Diffie-Hellman公钥导入CSP,请调用
    CryptImportKey
    函数,在
    pbData
    参数中传递指向公钥BLOB的指针,在
    dwDataLen
    参数中传递BLOB的长度,并在
    hPubKey
    参数中传递Diffie-Hellman密钥的句柄。这将导致执行计算,
    (Y^X)mod P
    ,从而创建共享密钥并完成密钥交换。此函数调用返回
    hKey
    参数中新的秘密会话密钥的句柄
  • 此时,导入的Diffie Hellman类型为
    CALG\u AGREEDKEY\u ANY
    。在使用密钥之前,必须将其转换为会话密钥类型。通过调用
    CryptSetKeyParam
    函数,将
    dwParam
    设置为
    KP\u ALGID
    ,并将
    pbData
    设置为指向表示会话密钥的
    ALG\u ID
    值的指针,例如
    CALG\u RC4
    ,可以实现这一点。在
    CryptEncrypt
    CryptDecrypt
    函数中使用共享密钥之前,必须先转换密钥。在转换密钥类型之前对其中任何一个函数的调用都将失败
  • 秘密会话密钥现在可以用于加密或解密
  • 当不再需要密钥时,通过调用
    cryptdirestroykey
    函数销毁密钥句柄

  • +1@Richard,解释得很清楚。您的建议将解决密钥协议方案,但如果我对使用DH的密钥传输感兴趣,我如何为PKI完成此任务?是否有解决方案?遇到类似的问题。。。