使用OpenSSL EVP的短期ECDH(ECDHE)

Ephemeral ECDH (ECDHE) using OpenSSL EVP

本文关键字:ECDH ECDHE OpenSSL EVP 使用      更新时间:2023-10-16

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

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

为了使我的密钥交换"短暂",我要执行以下操作吗?

  1. 使用EVP_PKEY_keygen在服务器(pub_s_e,priv_s_e)和客户端(pub_c_e,priva_c_e)上生成新的"临时"公钥和私钥
  2. 使用EVP_DigestSign函数在客户端和服务器上用主私钥对新的临时公钥进行签名(在服务器上用priva_s对pub_s_e进行签名,在客户端上用priva_c对pub_c_e进行签署)
  3. 在客户端和服务器之间交换已签名的临时公钥(可以是明文形式)
  4. 根据服务器的已知主公钥验证服务器的临时公钥,使用EVP_DigestVerify函数根据客户端的已知主密钥验证客户端的临时公钥
  5. 执行ECDH以导出共享密钥,对其进行散列(以去除弱比特),并使用类似EVP_BytesToKey的密钥导出函数来获得AES的加密密钥和初始化向量(IV)
  6. 像往常一样使用派生密钥和IV进行加密

这似乎提供了完美的前向保密性,因为主密钥的折衷将允许对未来密钥进行签名,但不允许检索过去的临时密钥。

我遗漏了什么吗?

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

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

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