迪菲—赫尔曼密钥交换是使用和RSA相似的技术吗?

近日在一次研发小组内部的 WPA3 技术介绍会上,演讲者提到加密无线开放网络的 OWE 技术基于迪菲—赫尔曼密钥交换,并随口说迪菲—赫尔曼密钥交换是使用和 RSA 相似的技术。这种说法是错误的!虽然迪菲—赫尔曼密钥交换和 RSA 加密算法都属于公钥密码技术,它们的工作机理和应用场景是不同的。作为网络安全相关的研发工程技术人员,有必要清楚地了解两者的工作机制和所基于的数学原理,以及它们之间的区别和联系。

A cryptographic system should be secure even if everything about the system, except the key, is public knowledge.
Auguste Kerckhoffs(奥古斯特·柯克霍夫,荷兰语言学家和密码学家,提出密码学的“柯克霍夫原则”)

迪菲—赫尔曼密钥交换

迪菲—赫尔曼密钥交换 (Diffie–Hellman key exchange,缩写为DH) 是一种保密通信协议,通过它可以让通信双方在没有任何预知信息的情况下,在不安全的公共信道上交换消息以创建共享密码。这个密码可以用于产生后续双方使用对称加密技术 (如 AES) 通信的密钥。

这种公钥分配以达成共享秘密的思想最早由斯坦福大学教授马丁·赫尔曼 (Martin Hellman) 的博士研究生瑞夫·墨克 (Ralph Merkle) 提出,而后赫尔曼教授的研究助理惠特菲尔德·迪菲 (Whitfield Diffie) 和赫尔曼教授共同发明了实用的密钥交换协议。迪菲与赫尔曼于1976在 IEEE 信息论会刊上受邀共同发表了论文《密码学的新方向》,为公开密钥密码学体制奠基,也正式宣告了迪菲—赫尔曼密钥交换这一新技术的诞生。

迪菲—赫尔曼密钥交换的工作原理,是基于数论中的整数模 n 乘法群及其原根的模幂 (modular exponentiation) 运算。下面以一个简单而具体的例子来描述:

  1. 爱丽丝选定一个素数 \(p=71\),再选定整数模 \(p\) 乘法群的一个原根 \(g=7\)
  2. 爱丽丝选定一个小于 \(p\) 的随机数 \(a=17\),计算 \(A=g^a\;mod\;p=7^{17}\;mod\;71 = 62\)
  3. 爱丽丝将 \((p,g,A)\) 一起发给鲍勃
  4. 鲍勃也选定一个小于 \(p\) 的随机数 \(b=39\),计算 \(B=g^b\;mod\;p=7^{39}\;mod\;71 = 13\)
  5. 鲍勃将 \(B\) 发回给爱丽丝
  6. 爱丽丝计算 \(s=B^a\;mod\;p=13^{17}\;mod\;71 = 42\)
  7. 鲍勃计算 \(s=A^b\;mod\;p=62^{39}\;mod\;71 = 42\)

计算 \(\color{#93F}{\bf62^{39}\;mod\;71}\) 很麻烦吗?其实很容易……

记住模算数有保持基本运算的性质: \[(a⋅b)\;mod\;m = [(a\;mod\;m)⋅(b\;mod\;m)]\;mod\;m\] 结合平方求幂原理,可以应用从右到左二进制位算法快速计算: \[\begin{align} 62^{39}\;mod\;71 & = (62^{2^0}⋅62^{2^1}⋅62^{2^2}⋅62^{2^5})\;mod\;71\\ & = (62⋅10⋅(62^{2^1}⋅62^{2^1})⋅(62^{2^4}⋅62^{2^4}))\;mod\;71\\ & = (62⋅10⋅(10⋅10)⋅(62^{2^3}⋅62^{2^3}⋅62^{2^4}))\;mod\;71\\ & = (62⋅10⋅29⋅(29⋅29⋅62^{2^3}⋅62^{2^4}))\;mod\;71\\ & = (62⋅10⋅29⋅(60⋅60⋅62^{2^4}))\;mod\;71\\ & = (62⋅10⋅29⋅(50⋅50))\;mod\;71\\ & = (62⋅10⋅29⋅15)\;mod\;71\\ & = 42 \end{align}\]

如同魔法一般,爱丽丝和鲍勃都得到了同样的 \(s\)\(42\),这就是两个人的共享秘密!此后,爱丽丝和鲍勃就可用 \(s\) 的哈希值作为对称密钥进行加密通讯,第三者无法知晓。

为什么会这样?因为乘法群模幂运算的性质,在模 \(p\)\(g^{ab}\)\(g^{ba}\) 相等:

\[A^b\;mod\;p=g^{ab}\;mod\;p=g^{ba}\;mod\;p=B^a\;mod\;p\]

所以计算出来的 \(s\) 值一定相同。当然,真正的应用中会使用大得多的 \(p\),否则攻击者可以穷举其所有的余数,去试图破解对称加密的密文。

注意 \((p,g,A,B)\) 是公开的,\((a,b,s)\) 是秘密的。现在假定一个窃听者伊芙可以看到爱丽丝和鲍伯之间的全部消息,那么她可以推导出 \(s\) 吗?答案是只有当 \((p,a,b)\) 值很小时才是实际可能的。伊芙首先必须从她知道的 \((p,g,A,B)\) 倒推出 \((a,b)\) :

  • \(A=g^a\;mod\;p\Rightarrow \color{fuchsia}{a = log_g A\;mod\;p}\)
  • \(B=g^b\;mod\;p\Rightarrow \color{fuchsia}{b = log_g B\;mod\;p}\)

这就是著名的离散对数问题。这是一个公认的计算难题,当前并没有找到多项式时间效率的算法来计算离散对数。所以只要选择了合适的 \((p,a,b)\),这个协议被认为是窃听安全的。RFC 3526 推荐了6个大素数的模幂 DH 群可供实际应用,其中最小的素数就有1536比特位!

还要强调的一点是,迪菲-赫尔曼密钥交换本身并不要求通信双方的身份验证,因此它很容易受到中间人攻击。如果攻击者可以在信道的中央窜改两边收发的消息,就可以假扮身份完成两次迪菲-赫尔曼密钥交换。这样攻击者就可以解密全部的信息。因此,通常实际应用中需要加入身份验证机制来防止这类攻击。

迪菲-赫尔曼密钥交换技术是对现代密码学至关重要的贡献。2015年,在这项发明公布39年后,迪菲和赫尔曼共同荣获被誉为“计算机界的诺贝尔奖” 的 ACM 图灵奖。ACM 的颁奖海报上直接称他们“发明了公钥密码技术”。

RSA加密算法

RSA 是一种公钥加密算法,以此为核心技术构成的同名公钥加密系统,被广泛应用于保密数据传输。今天,互联网的全面发展已经在社会的各个层面为大众提供极大便利。不论你是在网上冲浪、游戏、娱乐、购物、还是与亲友即时通讯、管理银行账户、投资买卖金融证券,或者只是简单地收发电子邮件,都有 RSA 在幕后运行保障你的隐私和数据安全。

RSA 实际上是三个人姓氏的缩写,他们是美国密码学家罗纳德·李维斯特 (Ronald Rivest)、以色列密码学家阿迪·沙米尔 (Adi Shamir) 和美国计算机科学家伦纳德·阿德曼 (Leonard Max Adleman) 。1977年,李维斯特、沙米尔和阿德曼三人在麻省理工学院 (MIT) 合作共同发明了 RSA 加密算法。算法最先发布在MIT的公开技术报告里,后来整理发表在1978年二月的 ACM 通讯 杂志,标题为《一种获取数字签名和公钥密码系统的方法》。

RSA 的基本思想是使用者创建由一个公钥和一个私钥组成的密钥对。公钥自由发布,私钥必须秘密保存。任何人都可以用公钥来加密消息,而生成的密文只有私钥持有者才能解读。另一方面,以私钥加密的信息,公钥都可以解开。由于我们假定私钥只是特定对象才能持有,所以使用私钥加密相当于生成数字签名,用公钥解密等效于验证签名。

RSA 加密算法包括四步操作过程:密钥生成、密钥分配、加密和解密。下面也举一个简单而具体的例子来说明:

  1. 爱丽丝随机选择两个素数 \(p=127\)\(q=5867\),计算 \(N=pq=745109\)
  2. 爱丽丝计算 \(N\)卡迈克尔函数 \(\lambda(N)=\lambda(745109)=52794\)
    • \(p\)\(q\) 都为素数时,通常 \(\lambda(pq)=lcm(p − 1, q − 1)\)
    • \(lcm\) 是求最小公倍数的函数,可以用欧几里得算法得出
    • \(lcm(126,5866)=52794\)
  3. 爱丽丝选择一个小于 \(\lambda(N)\) 且与之互素的数 \(e=5\),并求得 \(e\) 关于 \(\lambda(N)\)模逆元 \(d\equiv e^{-1}\pmod {\lambda(N)}\),得到 \(d=10559\)
    • 模逆元的定义是,找到 \(d\) 使得 \((d⋅e)\;mod\;\lambda(N)=1\)
    • \(d=10559\equiv 5^{-1}\pmod {52794}\)
  4. \(\pmb{(N,e)}\) 就是爱丽丝的公钥\(\pmb{(N,d)}\) 是她的私钥
    • 爱丽丝将她的公钥 \((745109,5)\) 发给鲍勃
    • 爱丽丝密藏她的私钥 \((745109,10559)\)
    • 爱丽丝销毁所有 \(p,q,\lambda(N)\) 的记录
  5. 当鲍勃想给爱丽丝送一个消息 \(M\) 时,先按照双方约定好的编码格式将 \(M\) 转化为一个或多个小于 \(N\) 的正整数 \(m\),然后使用爱丽丝的公钥逐个计算出密文 \(c\)。计算公式是 \(\pmb{c\equiv m^e\pmod N}\)
    • 假定 \(M\) 为“CACC 9678”,编码格式是空格为0、a-z/A-Z(忽略大小写)为1-26、0-9为27-36
    • 转化后得到正整数串 “030103 030036 333435”,注意每个都小于745109
    • 加密后的密文整数串 “184539 741303 358095”
      • \(184539 \equiv 30103^5\pmod {745109}\)
      • \(741303 \equiv 30036^5\pmod {745109}\)
      • \(358095 \equiv 333435^5\pmod {745109}\)
  6. 爱丽丝收到密文整数串后,使用自己的私钥逐个计算出明文 \(m\),计算公式是 \(\pmb{m\equiv c^d\pmod N}\)
    • \(30103 \equiv 184539^{10559}\pmod {745109}\)
    • \(30036 \equiv 741303^{10559}\pmod {745109}\)
    • \(333435 \equiv 358095^{10559}\pmod {745109}\)

以上第三步从 \(\color{#93F}{\bf(d\cdot 5)\;mod\;52794=1}\) 算出 \(d\),这是怎么做到的?

应用扩展欧几里得算法可以快速求解模逆元。参考该网页,根据互素的前提条件,可以写下关系式 (\(gcd\) 为最大公约数函数):

\[52794s+5t=gcd(5, 52794)=1\]

我们要求满足上式的最小正整数 \(t\)。下表演示算法的迭代过程:

序号 \(i\) \(q_{i-1}\) 余数 \(r_i\) \(s_i\) \(t_i\)
0 \(52794\) \(1\) \(0\)
1 \(5\) \(0\) \(1\)
2 \(52794 \div5 = 10558\) \(4\) \(1 - 10558\times 0 = 1\) \(0 - 10558\times 1 = -10558\)
3 \(5 \div4 = 1\) \(1\) \(0-1\times1 = -1\) \(1 - 1\times (-10558) = \bf10559\)

只需要两步迭代就得到余数\(1\),算法结束。最后的 \(t\) 就是我们要的 \(5^{-1}\pmod {52794}\)

解码后串起来得到同样的信息“CACC 9678”。为什么爱丽丝解密后的消息会与鲍勃发送的完全一致呢?原因就在模幂运算里。首先因为 \(c\equiv m^e\pmod N\),可以得到 \(c^d\equiv (m^e)^d \equiv m^{ed} \pmod N\)。由于 \((d⋅e)\;mod\;\lambda(N)=1\),推导出 \(ed = 1 + h\lambda(N)\) (\(h\) 为非负整数)。综合两式

\[\Rightarrow m^{ed} = m^{(1+h\lambda(N))} = \color{fuchsia}{m(m^{\lambda(N)})^h \equiv m(1)^h}\equiv m\pmod N\]

以上倒数第二个同余等式 (符号 \(\equiv\)) 的依据是欧拉定理。这样就证明了解密公式 \({m\equiv c^d\pmod N}\) 的正确性!还可以看到,\(e\)\(d\) 的次序对于 \(m^{ed}\;mod\;N\) 的结果无关,所以爱丽丝用私钥加密的消息,鲍勃可以拿爱丽丝的公钥解开。这也证明了数字签名的可行性。

安全性方面,如果第三方能从爱丽丝的公钥 \((N,e)\) 推算出 \(d\),那就破解了这一算法。但是破解的前提是先要从 \(N\) 里面分离出 \(p\)\(q\),这在 \(N\) 很大时是非常困难的。实际上,这就是著名的大数素因数分解问题,另一个公认的计算难题。迄今为止,“已知最好的算法比指数数量级时间要快,比多项式数量级时间要慢”。RSA 大数分解挑战 网站公布的最新纪录,是2020二月破解了 RSA-250,一个829比特的大数。这一进展表明1024比特 \(N\) 值公钥的安全性已经岌岌可危。有鉴于此,美国国家标准技术研究所 (National Institute of Standards and Technology,简写为NIST) 建议实际应用中的 RSA 密钥长度不少于2048比特。

另一方面,虽然公钥不需要保密传送,但却要求可靠地分配。否则,伊芙可以假扮爱丽丝,将自己的公钥发给鲍勃。如果鲍勃信以为真,伊芙就可以拦截所有鲍勃传递给爱丽丝的消息,用她自己的私钥解密。伊芙再将这个消息用爱丽丝的公钥加密后传给她。爱丽丝和鲍勃无法发现这样的中间人攻击。解决这一问题的方案,是建立可信赖的第三方机构签发证书来确保公钥的可靠性。这就是公钥基础架构 (Public Key Infrastructure,缩写 PKI) 的由来。

RSA 公钥加密算法,是三位密码学家和计算机科学家的天才创造。它的发明是公钥密码技术新的里程碑,也成为现代互联网安全通信的基石。李维斯特、沙米尔和阿德曼的杰出贡献,为他们赢得了2002 年的 ACM 图灵奖,比迪菲和赫尔曼早了足足13年!

区别与联系

下表总结了迪菲-赫尔曼密钥交换与 RSA 公钥加密算法的对比:

密码技术 迪菲-赫尔曼密钥交换 RSA加密算法
技术类型 非对称,公钥技术 非对称,公钥技术
数学原理 整数模 \(n\) 乘法群,原根 卡迈克尔函数,模逆元,欧拉定理
数学运算 模幂,平方求幂 模幂,平方求幂,扩展欧几里得算法
公开密钥 \((p,g,A,B)\) \((N,e)\)
私有密钥 \((a,b,s)\) \((N,d)\)
安全保障 离散对数难题 大数素因数分解难题
典型应用 密钥交换 加密/解密,数字签名
密钥长度 \(\ge2048\) 比特 \(\ge2048\) 比特
身份验证 需要外部支持 需要 PKI 支持公钥分配
前向保密 支持 不支持

可以看到,两者都属于非对称的公钥技术,都有一个公钥和私钥密钥对。它们都用到了模幂和平方求幂数学运算,RSA 公钥加密算法还需要应用扩展欧几里得算法求解模逆元。尽管有这些相似点,它们所基于数学原理是不同的,其安全性对应的计算难题也是性质相异的。这些特质决定了迪菲-赫尔曼密钥交换可用于密钥交换,但是不能用来加密/解密;而 RSA 公钥加密算法既可以加密/解密,又能支持数字签名。所以,综合来看二者使用相似的技术的说法不能成立。

基于迪菲-赫尔曼密钥交换演化出来的 ElGamal 加密算法,可以用来加密/解密消息,但是由于一些历史原因以及 RSA 公钥加密算法的巨大商业成功,ElGamal 加密算法并不流行。

在现代密码学中,密钥长度定义为加密算法使用的密钥的比特数。理论上,因为所有的算法都可能会被暴力破解,所以密钥长度确定了一个加密算法的安全性上限。密码分析学研究表明,迪菲-赫尔曼密钥交换和 RSA 公钥加密算法的密钥强度大致相同。破解离散对数和分解大数素因子的计算强度是可比拟的。因此,在实际应用中对这两种密码技术的推荐密钥长度都是至少2048比特。

对于身份验证,迪菲-赫尔曼密钥交换需要外部支持,否则无法抗击中间人攻击。RSA 公钥加密算法虽然可以用于验证数字签名,但前提是有 PKI 支持可靠的公钥分配。当前 PKI 的体系已经相当成熟,有专门的证书认证机构 (Certificate Authority,缩写 CA) 承担公钥体系中公钥合法性检验的责任,发放和管理 X.509 格式的公钥数字证书。

RSA 公钥加密算法在实际应用中存在一个问题,即它没有前向保密的功能。前向保密 (Forward Secrecy),有时也被称为完全前向保密 (Perfect Forward Secrecy),是保密通信协议的一种安全属性,指的是长期使用的主密钥泄漏不会导致过去的会话信息泄漏。如果系统具有前向保密性,就可以保护在私钥泄露时历史通信纪录的安全。设想一下这样的情况,虽然伊芙无法破解爱丽丝与鲍勃之间用 RSA 加密的消息,伊芙可以存档全部的过往消息密文。未来某一天,爱丽丝的私钥因为某种原因被泄漏,那么伊芙就可以解密所有的消息记录。

解决这个问题的办法,就是迪菲-赫尔曼密钥交换!记得迪菲-赫尔曼密钥交换的公钥里的 \((A,B)\) 由双方从各自的私钥 \((a,b)\) 生成,那么如果每次会话时都产生随机的 \((a,b)\) 值,未来的密钥泄漏并不会破解之前的会话密钥。这说明迪菲-赫尔曼密钥交换是支持前向保密的!如果我们结合迪菲-赫尔曼密钥交换的前向保密性与 RSA 公钥加密算法的数字签名功能,就可以实现带有身份验证保护的密钥交换。这一过程可以简化示例如下:

  1. 爱丽丝与鲍勃双方交换经过认证的 RSA 公钥证书
  2. 爱丽丝与鲍勃各自产生随机的 \((a,b)\) 值,用共享的迪菲-赫尔曼 \((p,g)\) 计算出 \((A,B)\)
  3. 爱丽丝用自己的 RSA 私钥加密 \(A\) 生成数字签名,将之与 \(A\) 一起发给鲍勃
  4. 鲍勃用自己的 RSA 私钥加密 \(B\) 生成数字签名,将之与 \(B\) 一起发给爱丽丝
  5. 爱丽丝用鲍勃的 RSA 公钥验证签名,确认 \(B\) 来自鲍勃,用 \((p,a,B)\) 算出 \(s\)
  6. 鲍勃用爱丽丝的 RSA 公钥验证签名,确认 \(A\) 来自爱丽丝,用 \((p,b,A)\) 算出 \(s\)
  7. 爱丽丝和鲍勃达成共享秘密,生成后续对称加密 (AES) 的会话密钥,进行保密通信

这里 RSA 数字签名保障了密钥交换不受中间人攻击。另外以上的第二步中,如果每次会话都产生新的随机数,那么即使有一天爱丽丝或鲍勃的RSA 私钥泄漏,也不会威胁以前会话的安全性,因为窃密者还是必须要去求解离散对数的难题。我们也实现了前向保密。实际上,这就是无处不在的传输层安全性协议 (Transport Layer Security,缩写 TLS) 所定义的 DHE-RSA 密码套件的工作机理。

DHE-RSA加密套件

传输层安全性协议 (TLS) 及其前身安全套接层协议 (Secure Sockets Layer,缩写 SSL) 是一种为互联网通信提供安全及数据完整性保障的安全协议。TLS 广泛使用在浏览器、电子邮件、即时通信、VoIP、虚拟专用网 (VPN) 等应用程序中,已成为事实上的互联网保密通信工业标准。目前 TLS 1.2 是得到普遍支持的协议版本,支持建立于 TCP 之上的安全连接 。针对 UDP 的应用也定义了数据报传输层安全性协议 (Datagram Transport Layer Security,缩写 DTLS)。DTLS 与 TLS 大同小异,主要在可靠性和安全性方面为无连接的 UDP 传输做了一些扩展。DTLS 1.2 与 TLS 1.2 功能相匹配。

TLS 协议采用主从式(客户机/服务器)架构模型。它的工作模式,是使用 X.509 认证和非对称加密算法对通信方做身份认证,之后交换密钥生成对称加密的会话密钥。这个会话密钥就用来加密通信双方交换的数据,保证信息的保密性和可靠性,不必担心被第三方攻击或窃听。为了标识方便,TLS 1.2 协议将使用的身份验证、密钥交换、批量加密和消息认证码算法 组合成密码套件 (Cipher Suite) 名称。每个密码套件被赋予一个双字节的编码。TLS 密码套件注册表提供了全部登记在录的密码套件命名参考表,参考表以编码值从小到大排序。

由于非对称加密算法 (RSA 等) 计算强度远远高于对称加密算法 (AES 等),从性能上考虑实际应用几乎总是使用对称加密算法批量加密消息。

TLS 1.2 协议支持一系列组合迪菲-赫尔曼密钥交换与 RSA 公钥加密算法的密码套件。它们都以TLS_DH_RSATLS_DHE_RSA作为开头。DHE 中的 “E” 代表 “Ephemeral” (临时的),其意义是要求每次会话都要产生随机的 \((a,b)\) 值。所以TLS_DHE_RSA密码套件能提供前向保密,而TLS_DH_RSA不可以,实际应用中应该优先选择前者。

这里以典型的TLS_DHE_RSA_WITH_AES_128_CBC_SHA(编码 0x00,0x33) 密码套件为例,解析迪菲-赫尔曼与 RSA 协同工作建立 DTLS 会话的过程。首先解释一下密码套件的构成:

  • DHE:临时 DH 实现密钥交换
  • RSA:签名认证 DHE 的公钥
  • AES_128_CBC:128比特密码分组链接模式 AES 加密
  • SHA:160比特 HMAC-SHA1 散列消息认证码

参考从网络端口截取的数据包文件 dtls-dhe-rsa.pcap,可得到以下握手协议消息时序图:

sequenceDiagram autonumber participant C as 客户机 (Client) participant S as 服务器 (Server) Note over C,S: 握手协议 rect rgb(230, 250, 255) C->>S: Client Hello (Cr, Cipher Suites)) S-->>C: Hello Verify Request (Cookie) C->>S: Client Hello (Cr, Cookie, Cipher Suites) S-->>C: Server Hello (Sr, Cipher Suite), Certificate (Sn, Se) S-->>C: Server Key Exchange (p,g,A,Ss) S-->>C: Certificate Request, Server Hello Done C->>S: Certificate (Cn, Ce) C->>S: Client Key Exchange (B) C->>S: Certificate Verify (Cs) end Note over C,S: 加密通道建立 rect rgb(239, 252, 202) C->>S: Change Cipher Spec, Encrypted Handshake Message S-->>C: Change Cipher Spec, Encrypted Handshake Message C->>S: Application Data S-->>C: Application Data end

参考时序图中数据包编号解析如下:

  • 数据包 \(\require{enclose}\enclose{circle}{1}-\enclose{circle}{3}\) 实现初始握手信息交换:
    • 客户机先发出问候消息,消息包含随机数 \(C_r\) 和所支持的密码套件列表
    • 服务器回应一个问候验证请求消息,消息包含一个信息块 (Cookie)
    • 客户机收到验证请求后重发问候消息,包括上次的全部内容外加复制的信息块

问候验证是 DTLS 特有的,目的是防止拒绝服务攻击。协议规定,服务器只有在收到包含复制的信息块的问候消息后,才会继续为该客户机提供服务。

  • 数据包 \(\require{enclose}\enclose{circle}{4}-\enclose{circle}{6}\) 显示服务器进入验证和密钥交换阶段:
    • 服务器先发出问候消息回应,消息包含了随机数 \(S_r\) 和所选定的密码套件
      • 如下图所示,服务器选择了TLS_DHE_RSA_WITH_AES_128_CBC_SHA
    • 同一数据包还包含了服务器证书消息,证书一般较大,会分成多个分片 (fragment)
    • 服务器证书提供了可验证其签名的 RSA 公钥 \((S_N,\;S_e)\)
    • 接下来服务器发出密钥交换消息,消息包含了其 DH 公钥 \((p,g,A)\) 和签名\(Ss\)
      • 下图中 \(p\) 的长度256字节,说明密钥长度为2048比特,\(Pubkey\) 就是 \(A\)
      • 图中也可看到签名选用算法是 SHA512 和 RSA,
      • 操作是先计算 \(SHA512(Cr,Sr,p,g,A)\),再用服务器 RSA 私钥加密
    • 之后是服务器发的证书请求消息和问候结束消息
      • 服务器请求客户机发送可验证其签名的 RSA 公钥证书

注意:如果是使用 DH-RSA 密码套件,则服务器端的 DH 公钥参数 \((p,g,A)\) 都是不变的,会直接包含在其证书消息中, 这时服务器不会发出密钥交换消息\(\require{enclose}\enclose{circle}{5}\)。对于 DHE-RSA,每次会话的 \(A\) 值都不一样。

  • 数据包 \(\require{enclose}\enclose{circle}{7}-\enclose{circle}{9}\) 显示客户机进入验证和密钥交换阶段:
    • 客户机先发出证书消息,证书包括 RSA 公钥 \((C_N,\;C_e)\),也会分成多个分片
    • 客户机再发出密钥交换消息,消息包含了其 DH 公钥 \(B\)
      • 下图中的\(Pubkey\) 就是 \(B\)
    • 客户机最后发出证书验证消息,消息包含了签名 \(Cs\)
      • 签名覆盖除最开始的客户机问候 \(\require{enclose}\enclose{circle}{1}\) 及问候验证请求 \(\require{enclose}\enclose{circle}{2}\) 之外的全部过往消息
      • 签名操作同样是先计算 \(SHA512\),再用客户机 RSA 私钥加密
  • 数据包 \(\require{enclose}\enclose{circle}{10}-\enclose{circle}{11}\) 完成握手并建立加密通道:
    • 双方先各自验证对方发过来的签名
    • 验证成功后运行 DH 算法生成同样的预备主密钥 (pre_master_secret)
    • 双方调用伪随机函数(PRF)从预备主密钥生成48字节主密钥 (master_secret): \[master\_secret = PRF(pre\_master\_secret,\unicode{x201C}master\;secret\unicode{x201D},Cr+Sr)[0..47]\]
    • 双方再次调用 PRF 从主密钥生成72字节密钥块 (key_block): \[key\_block = PRF(master\_secret,\unicode{x201C}key\;expansion\unicode{x201D},Sr+Cr)[0,71]\]
    • 密钥块分配给HMAC-SHA1AES_128_CBC功能模块:
      • 客户机写消息验证码 (MAC) 密钥:20字节
      • 服务器写消息验证码 (MAC) 密钥:20字节
      • 客户机写加密密钥:16字节
      • 服务器写加密密钥:16字节
      注意TLS/DTLS 1.2规定此密码套件使用显式初始向量 (IV),不需要分配密钥块
    • 客户机产生更新密码规范 (Change Cipher Spec) 消息,表明开始使用加密和 MAC 模块
    • 客户机第三次调用 PRF 生成用于主密钥和握手消息验证的12字节握手结束验证码,验证码打包成握手结束消息,输入到加密和 MAC 模块: \[PRF(master\_secret,finished\_label,SHA256(handshake\_messages)[0,11]\]
    • 客户机发送更新密码规范消息和加密后的握手结束消息到服务器
    • 服务器验证收到的客户机握手结束消息后,重复上面三步,生成自己的更新密码规范消息和加密后的握手结束消息,发送给客户机
    • 客户机验证收到的服务器握手结束消息完成握手,加密通道建成
  • 数据包 \(\require{enclose}\enclose{circle}{12}-\enclose{circle}{13}\) 显示加密的应用数据交换正式开始

这就是使用TLS_DHE_RSA_WITH_AES_128_CBC_SHA(编码 0x00,0x33) 密码套件建立安全信息通道的完整过程。DHE 实现了有前向保密保护的密钥交换,而 RSA 数字签名为 DHE 提供了身份验证功能,二者结合打造了一种安全通信的解决方案。清楚了解了这些之后,我们就会更好地掌握迪菲-赫尔曼与 RSA 的工作机理,有效应用于实际工作中并避免不必要的失误。