使用OpenSSL EVP的短暂ECDH(ECDHE)

时间:2017-01-14 04:12:55

标签: c++ c encryption openssl

所以,我正在尝试使用OpenSSL EVP方法对椭圆曲线DH执行密钥交换,以获得共享密钥。这对于在GCM模式下使用AES为自定义协议提供强大的安全性是必要的。

问题是,我似乎只能找到有关静态密钥交换(ECDH)的信息和示例(参见this answer)。

要使我的密钥交换“短暂”,我是否会执行以下操作?

  1. 使用EVP_PKEY_keygen
  2. 在服务器(pub_s_e,priv_s_e)和客户端(pub_c_e,priv_c_e)上生成新的“短暂”公钥和私钥
  3. 使用EVP_DigestSign函数在客户端和服务器上使用主私钥签署新的临时公钥(使用服务器上的priv_s签名pub_s_e,使用客户端上的priv_c签署pub_c_e)。
  4. 在客户端和服务器之间交换已签名的短暂公钥(可以是明文)。
  5. 针对服务器的已知主公钥验证服务器的临时公钥,使用EVP_DigestVerify函数针对客户端的已知主公钥验证客户端的临时公钥。
  6. 执行ECDH以获取共享密钥,哈希(删除弱位)并使用密钥派生函数(如EVP_BytesToKey)获取AES的加密密钥和初始化向量(IV)。
  7. 使用派生密钥和IV照常加密。
  8. 这似乎提供了完美的前向保密,因为主密钥的妥协将允许签署未来的密钥,但不允许检索过去的临时密钥。

    我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

好吧,我最终解决了这个问题。短暂的ECDH只需要在服务器和客户端上生成短暂的密钥对(使用EVP_PKEY_keygen。对于ECDHE,对它们进行身份验证是可选的,但使用上面建议的静态密钥进行的签名"方法是有效的。

通过明文发送静态公钥不会造成任何问题,因此客户端需要做的就是验证服务器的证书并验证服务器临时公钥上的签名。

答案 1 :(得分:0)

我使用openssl evp库进行了一些实验,以在C语言中执行简单的ECDH密钥协议。自述文件包含有关如何进行编译的信息。我为自己添加了一些评论,以了解发生了什么。希望能帮助到你。 https://github.com/prithuadhikary/OPENSSL_EVP_ECDH_EXAMPLE