首页 > Note > 使用 openssl 进行 DH 密钥交换

使用 openssl 进行 DH 密钥交换

在我之前的博客中聊到了 DH 密钥交换的原理 . 这里来讨论如何使用 OPENSSL 进行 DH 密钥交换。

一 原理验证

OPENSSL 提供了一系列API, 可以在方便地进行大数计算。在这里我们先对 DH 密钥交换的原理 中讲到的原理进行代码级别的验证。对原理不感兴趣的可以跳过这一小节。
由于在 DH 密钥交换过程中,大部分的操作过程都是一样的,可以定义一个基类来抽象:

  • m_pri_key 是双方生成的私密随机数。
  • GetSharedNum() 返回双方交换的中间变量 G^A mod P
  • GenKey() 即完成了密钥交换,返回交换成功后的密钥。

DH交换发起方的类如下:

m_dh_nid 是 OID (ObjectID 对象标识) 的延伸。OID 是由国际电信联盟(ITU)和ISO/IEC标准化的标识符机制,用于以全局明确的持久名称命名任何对象、概念或“事物”的一组数字。NID (NameID) 则是与 OID 相对应的一个字符串名称;在 DH 密钥交换中,NID 可以是 NID_ffdhe2048NID_ffdhe3072NID_ffdhe4096NID_ffdhe6144 或 NID_ffdhe8192 中的一种。每一种 NID 背后都是由密码学专家或组织精心设计的一组数据 DH(内容包括 G,P等)。当然,我们也可以设计使用自己的数据。

密钥交换接受方的类如下:

最后来看 DH 密钥交换的过程:

可以看到,整个过程中,交换的数据只有 nid 和 shared_num 。最终双方生成的 key 是相同的,完成了密钥交换。

二. OPENSSL 进行 DH 密钥交换

最主要的结构体为 typedef struct dh_st DH; , 原型 dh_st 定义在文件 dh_locl.h 中:

DH 的生成有多种方式,如前面说的 DH_new_by_nid, 还有后面用到的 DH_generate_parameters_ex .此外还有从 BIO 等生成 DH 的方法。

  • DH_generate_parameters_ex : 用于生成一个随机的 DH 结构体
    • 参数 prime_len 是生成的质数 p 的位长度。
    • 参数 generator 是一个大于 1 的很小的数,一般是 2 或 5 。
  • DH_generate_key : 用于生成公钥和私钥, 不要和 RSA 的公私钥弄混,这里的公钥是指和双方交换的数 G^a % P, 这里的私钥指双方保留的私密数字
  • DH_compute_key 用于计算最后交换的结果密钥
    • 参数 key 即是结果密钥。其长度可以使用 DH_size() 计算
    • 参数 pub_key 是从对方获取的交换数。

一个密钥交换的示例如下:

 

 

 

 

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.