【发布时间】:2017-05-29 12:58:30
【问题描述】:
因此,我正在尝试使用 OpenSSL EVP 方法对椭圆曲线 DH 执行密钥交换,以导出共享密钥。这对于在 GCM 模式下使用 AES 为自定义协议提供强大的安全性是必要的。
问题是,我似乎只能找到有关交换静态密钥 (ECDH) 的信息和示例(请参阅 here)。
要使我的密钥交换“短暂”,我应该执行以下操作吗?
- 使用
EVP_PKEY_keygen在服务器(pub_s_e,priv_s_e)和客户端(pub_c_e,priv_c_e)上生成一个新的“临时”公钥和私钥 - 使用
EVP_DigestSign函数在客户端和服务器上使用主私钥签署新的临时公钥(在服务器上使用 priv_s 签署 pub_s_e,在客户端使用 priv_c 签署 pub_c_e)。 - 在客户端和服务器之间交换签名的临时公钥(可以是明文)。
- 根据服务器的已知主公钥验证服务器的临时公钥,使用
EVP_DigestVerify函数根据客户端的已知主公钥验证客户端的临时公钥。 - 执行 ECDH 以派生共享密钥,对其进行哈希处理(以删除弱位)并使用像
EVP_BytesToKey这样的密钥派生函数来获取 AES 的加密密钥和初始化向量 (IV)。 - 使用派生密钥和 IV 照常加密。
这似乎提供了完美的前向保密,因为主密钥的妥协将允许签署未来的密钥,但不允许检索过去的临时密钥。
我错过了什么吗?
【问题讨论】:
标签: c++ c encryption openssl