【问题标题】:Ephemeral ECDH (ECDHE) using OpenSSL EVP使用 OpenSSL EVP 的临时 ECDH (ECDHE)
【发布时间】:2017-05-29 12:58:30
【问题描述】:

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

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

要使我的密钥交换“短暂”,我应该执行以下操作吗?

  1. 使用EVP_PKEY_keygen在服务器(pub_s_e,priv_s_e)和客户端(pub_c_e,priv_c_e)上生成一个新的“临时”公钥和私钥
  2. 使用EVP_DigestSign 函数在客户端和服务器上使用主私钥签署新的临时公钥(在服务器上使用 priv_s 签署 pub_s_e,在客户端使用 priv_c 签署 pub_c_e)。
  3. 在客户端和服务器之间交换签名的临时公钥(可以是明文)。
  4. 根据服务器的已知主公钥验证服务器的临时公钥,使用EVP_DigestVerify 函数根据客户端的已知主公钥验证客户端的临时公钥。
  5. 执行 ECDH 以派生共享密钥,对其进行哈希处理(以删除弱位)并使用像 EVP_BytesToKey 这样的密钥派生函数来获取 AES 的加密密钥和初始化向量 (IV)。
  6. 使用派生密钥和 IV 照常加密。

这似乎提供了完美的前向保密,因为主密钥的妥协将允许签署未来的密钥,但不允许检索过去的临时密钥。

我错过了什么吗?

【问题讨论】:

    标签: c++ c encryption openssl


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2021-03-17
        • 2020-07-24
        • 2020-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-03
        相关资源
        最近更新 更多