Diffie–Hellman 密钥交换
Diffie–Hellman 密钥交换(DHKE)
Diffie–Hellman 密钥交换(DHKE)是一种通过公共(不安全)信道安全交换密码学密钥的密码学方法(密钥协商协议),即使通信被窃听,也不会泄露密钥。交换得到的密钥随后用于加密通信(例如使用 AES 等对称密码)。
DHKE 是最早的公钥协议之一,它允许双方安全地交换数据,使窃听双方通信的人无法获知所交换的信息。
Diffie–Hellman(DH)方法是一种匿名密钥协商方案:它允许事先互不了解的双方通过不安全信道共同建立共享密钥。
请注意,DHKE 方法能够抵御嗅探攻击(数据截获),但容易受到中间人攻击(攻击者秘密转发双方的通信,并可能篡改通信内容)。
Diffie–Hellman 密钥交换协议可以使用离散对数(经典 DHKE 算法)实现,也可以使用椭圆曲线密码学(ECDH 算法)实现。
通过混合颜色交换密钥
Diffie–Hellman 密钥交换协议与“通过混合颜色交换密钥”这一概念非常相似。后者具有直观的视觉表现,更容易理解。因此,我们先解释如何通过颜色混合交换秘密颜色。
颜色混合密钥交换方案基于以下假设:如果有两种不同颜色的液体,我们可以轻松混合颜色并得到一种新颜色,但逆向操作几乎不可能,即无法将混合后的颜色分离回原来的颜色成分。
颜色交换场景的具体步骤如下:
- Alice 和 Bob 商定一种无需保密的任意起始(共享)颜色(如黄色)。
- Alice 和 Bob 分别选择一种自己保密的秘密颜色(如红色和海绿色)。
- 最后,Alice 和 Bob 分别将自己的秘密颜色与双方共享的颜色混合。所得混合颜色可公开交换(在本例中为橙色和浅天蓝色)。

颜色交换场景的后续步骤如下:
- Alice 和 Bob 公开交换各自的混合颜色。
- 假设没有高效方法能够从混合颜色中提取(分离)秘密颜色,因此知道混合颜色的第三方无法获知秘密颜色。
- 最后,Alice 和 Bob 分别将从对方收到的颜色与自己的秘密颜色混合。
- 结果是最终的混合颜色(黄褐色),与对方得到的混合颜色完全相同。
- 它就是安全交换得到的共享密钥。

即使第三方截获了颜色交换过程,也很难通过计算确定秘密颜色。
Diffie-Hellman 密钥交换协议基于类似概念,但使用离散对数和模幂运算代替颜色混合。
Diffie-Hellman 密钥交换(DHKE)协议
下面解释 DHKE 协议的工作原理。
DHKE 背后的数学原理
DHKE 基于模幂运算的一项简单性质:
(g^a)^b mod p = (g^b)^a mod p
其中 g、a、b 和 p 是正整数。
如果已知 A = g^a mod p 和 B = g^b mod p,就可以计算 g^(ab) mod p,而无需泄露 a 或 b(它们称为秘密指数)。
在计算理论中,不存在能够找出秘密指数的高效算法。如果从以下方程中已知 m、g 和 p:
m = g^s mod p
就没有高效(快速)的算法能求出秘密指数 s。这称为离散对数问题(DLP))。
离散对数问题(DLP)
计算机科学中的离散对数问题(DLP)定义如下:
- 给定元素 b 和值 a = b^x,求指数 x(如果存在)
指数 x 称为离散对数,即 x = logb(a)。元素 a 和 b 可以是模 p 的普通整数(来自群 ℤ/pℤ),也可以是有限循环乘法群 G(模 p)的元素,其中 p 通常是素数。
在密码学中,许多算法依赖精心选择的群上 DLP 问题的计算困难性,对此不存在高效算法。
DHKE 协议
熟悉上述模幂运算的数学性质后,就可以解释 DHKE 协议了。其工作方式如下:

下面逐步解释这个密钥交换过程:
- Alice 和 Bob 商定使用两个公开整数:模数 p 和底数 g(其中 p 是素数,g 是模 p 的本原根)。
- 例如,令 p = 23,g = 5。
- 整数 g 和 p 是公开的,通常是源代码中硬编码的常量。
- Alice 选择一个秘密整数 a(如 a = 4),然后计算数字 A = g^a mod p 并发送给 Bob。
- 数字 A 是公开的。它通过公共信道发送,即使被截获也不会泄露秘密指数 a。
- 在本例中:A = 5^4 mod 23 = 4。
- Bob 选择一个秘密整数 b(如 b = 3),然后计算数字 B = g^b mod p 并发送给 Alice。
- 在本例中:B = 5^3 mod 23 = 10
- Alice 计算 s = B^a mod p
- 在本例中:s = 10^4 mod 23 = 18
- Bob 计算 s = A^b mod p
- 在本例中:s = 4^3 mod 23 = 18
- 此时 Alice 和 Bob 共享一个秘密数字 s
- s = A^b mod p = B^a mod p = (g^a)^b mod p = (g^b)^a mod p = g^(ab) mod p = 18
- 无法根据公开数字 A 和 B 计算共享密钥 s,因为无法高效求出秘密指数 a 和 b。
在最常见的 DHKE 实现中(遵循 RFC 3526),底数为 g = 2,模数 p 是一个很大的素数(1536 ... 8192 位)。
DHKE 协议的安全性
DHKE 协议的基础是 Diffie–Hellman 问题在实践中的困难性。它是计算机科学中著名的 DLP(离散对数问题))的一种变体,目前仍不存在解决该问题的高效算法。
DHKE 通过不安全的公共(可嗅探)信道(如沿电缆传输或通过空气中的电波传播的信号)交换非秘密整数序列,但不会泄露秘密交换的共享私钥。
再次提醒,经典形式的 DHKE 协议容易受到中间人攻击:黑客可以截获并修改双方交换的消息。
最后请注意,整数 g、p、a 和 p 通常是非常大的数字(1024、2048、4096 位甚至更大),这使暴力攻击变得毫无意义。
DHKE 在线示例
作为可交互示例,你可以试用这个在线 DHKE 工具:http://www.irongeek.com/diffie-hellman.php

ECDH——基于椭圆曲线的 Diffie-Hellman 密钥交换协议
椭圆曲线 Diffie–Hellman(ECDH)是一种匿名密钥协商协议,允许各自拥有一对椭圆曲线公钥和私钥的双方通过不安全信道建立共享秘密。
ECDH 是经典 DHKE 协议的一种变体,它用椭圆曲线计算代替模幂运算,以提高安全性。后面的椭圆曲线密码学(ECC)章节将详细介绍相关内容。