Diffie-Hellman 密钥交换与 ECDH:从数学原理到工程实践

密码学概念 · 2026-06-27

概述

1976 年,Whitfield Diffie 和 Martin Hellman 发表了密码学史上具有里程碑意义的论文《New Directions in Cryptography》,提出了 Diffie-Hellman(DH)密钥交换协议。这是第一个实用的非对称密钥交换机制,解决了通信双方如何在公开信道上协商共享秘密的问题,为后续所有安全协议奠定了基础。

半个世纪后,DH 密钥交换及其椭圆曲线变体(ECDH)仍然是互联网安全的核心。TLS 1.3 握手、IPSec VPN、Signal 协议、WireGuard VPN —— 几乎所有现代安全通信协议都依赖 DH/ECDH 来实现密钥协商和前向安全。

本文将从数学基础出发,系统讲解 DH 协议的原理、安全假设、参数选择、ECDH 的椭圆曲线扩展,以及工程实践中的关键安全要点。

数学基础:离散对数问题

模运算与有限域

DH 协议的安全性基于离散对数问题(Discrete Logarithm Problem, DLP):给定一个有限循环群 $G$,其生成元为 $g$,群阶为 $n$,对于群中的任意元素 $h$,找到满足 $g^x = h$ 的整数 $x$($0 \leq x < n$)在计算上是困难的。

最经典的 DH 实例使用有限域乘法群 $\mathbb{Z}_p^*$,其中 $p$ 是一个大素数。该群的阶为 $p-1$,生成元 $g$ 的阶通常为 $p-1$ 或其大素因子。

计算复杂性

对于 $n$ 比特的素数 $p$,已知最有效的通用离散对数算法是数域筛法(Number Field Sieve, NFS),其亚指数时间复杂度为:

$$L_p\left[\frac{1}{3}, \sqrt[3]{\frac{64}{9}}\right] = \exp\left(\left(\sqrt[3]{\frac{64}{9}} + o(1)\right)(\ln p)^{1/3}(\ln \ln p)^{2/3}\right)$$

这意味着要达到 128 位安全级别,有限域 DH 的模数 $p$ 至少需要 3072 位(NIST SP 800-57 的推荐)。

来源:Odlyzko, 1990NIST SP 800-57 Part 1 Rev. 5 第 5.6 节。

DH 协议流程

基本协议

DH 密钥交换的通信流程如下:

CODE
Alice                                          Bob
─────                                          ───
选择私钥 a ∈ [2, n-2]                         选择私钥 b ∈ [2, n-2]
计算公钥 A = g^a mod p                        计算公钥 B = g^b mod p

              ──── A ────────────────→
              ←──────────── B ────

计算共享密钥 s = B^a = g^(ab)                 计算共享密钥 s = A^b = g^(ab)

协议结束后,双方共享秘密 $s = g^{ab} \bmod p$。攻击者即使截获 $A$ 和 $B$,在 DLP 困难的假设下也无法计算出 $s$。

安全假设

DH 协议的安全性依赖于以下假设:

  • 计算 Diffie-Hellman 假设(CDH):给定 $g^a$ 和 $g^b$,计算 $g^{ab}$ 是困难的
  • 判定 Diffie-Hellman 假设(DDH):区分 $(g^a, g^b, g^{ab})$ 和 $(g^a, g^b, g^c)$($c$ 随机)是困难的
DDH 比 CDH 更强,是许多安全证明的基础。需要注意的是,DH 协议本身不提供身份认证 —— 攻击者可以分别与 Alice 和 Bob 执行协议(中间人攻击),因此必须与数字签名或证书机制结合使用。

参数选择与标准化

安全素数

DH 参数必须满足严格的数学性质以防止攻击:

  • 安全素数:$p = 2q + 1$,其中 $q$ 也是素数(Sophie Germain 素数)。这使得 $\mathbb{Z}_p^*$ 的阶为 $p-1 = 2q$,其大素因子 $q$ 防止 Pohlig-Hellman 攻击
  • 生成元选择:$g$ 应生成阶为 $q$ 的子群,避免生成整个群(防止小子群攻击)
  • 私钥范围:私钥 $a, b$ 应在 $[2, n-2]$ 范围内均匀随机选取,其中 $n$ 为子群阶

标准化参数

为避免弱参数,多个标准组织定义了标准化的 DH 参数组:

标准来源参数组模数长度安全级别
IETF RFC 2631MODP Group 1-5768-1536 位已废弃
IETF RFC 3526MODP Group 14-182048-8192 位112-192 位
IETF RFC 7919ffdhe2048-81922048-8192 位112-192 位
NIST SP 800-56ASafe-prime groups2048-3072 位112-128 位
注意:768 位和 1024 位的 DH 参数已被认为不安全(Logjam 攻击证明 1024 位 DH 可被国家级攻击者破解)。TLS 1.3 要求 DH 参数至少 2048 位。

RFC 3526 Group 14(2048-bit MODP)

这是最常用的标准化 DH 参数组之一:

椭圆曲线 Diffie-Hellman(ECDH)

从有限域到椭圆曲线

椭圆曲线密码学(ECC)由 Neal Koblitz 和 Victor Miller 于 1985 年独立提出。ECDH 是 DH 协议在椭圆曲线群上的变体,其安全性基于椭圆曲线离散对数问题(ECDLP):给定椭圆曲线上的基点 $G$ 和公钥点 $Q = dG$,求解标量 $d$ 是计算上困难的。

与有限域 DLP 不同,ECDLP 没有已知的亚指数时间算法。目前最有效的通用算法是 Pollard's rho 算法,时间复杂度为 $O(\sqrt{n})$,其中 $n$ 为子群阶。这意味着 256 位的椭圆曲线即可提供 128 位的安全级别,远优于有限域 DH。

椭圆曲线参数

ECDH 需要以下标准化参数(由 SECG、NIST 等组织定义):

参数说明示例
曲线方程椭圆曲线数学形式$y^2 = x^3 + ax + b$(素数域)
基域有限域 $\mathbb{F}_p$ 或 $\mathbb{F}_{2^m}$素数 $p$
基点 $G$生成元点,具有大素数阶压缩/未压缩坐标
子群阶 $n$基点生成的循环群的阶大素数
余因子 $h$曲线阶与子群阶之比通常为 1, 2, 4, 8

常用曲线对比

曲线名称安全级别密钥长度特点
NIST P-256 (secp256r1)128 位256 位最广泛支持,但参数来源受质疑
NIST P-384 (secp384r1)192 位384 位更高安全级别
Curve25519128 位256 位Daniel Bernstein 设计,更安全 API
secp256k1128 位256 位比特币采用,高效实现丰富
SM2 曲线128 位256 位国密标准 GM/T 0003.1-2012

ECDH 协议流程

CODE
Alice                                          Bob
─────                                          ───
选择私钥 d_A ∈ [1, n-1]                       选择私钥 d_B ∈ [1, n-1]
计算公钥 Q_A = d_A · G                        计算公钥 Q_B = d_B · G

              ──── Q_A ───────────────→
              ←──────────── Q_B ───────

计算共享密钥 S = d_A · Q_B = d_A · d_B · G   计算共享密钥 S = d_B · Q_A = d_A · d_B · G

共享密钥 $S$ 的 x 坐标通常作为对称加密的密钥材料,经过密钥派生函数(KDF)处理后使用。

前向安全(Forward Secrecy)

概念与重要性

前向安全是 DH/ECDH 最重要的安全属性:即使攻击者在未来获取了通信双方的长期私钥,也无法解密过去捕获的加密通信。

在 TLS 中,前向安全通过临时 Diffie-Hellman(DHE 或 ECDHE)实现:每次会话都生成新的临时 DH 密钥对,会话结束后立即销毁。这与静态 DH(长期密钥)和 RSA 密钥交换(无前向安全)形成对比。

TLS 1.3 中的前向安全

TLS 1.3 强制使用前向安全,所有非 PSK(预共享密钥)模式都要求 ECDHE 或 DHE 密钥交换。TLS 1.2 中可选的 ECDHE 在 TLS 1.3 中变为强制。

CODE
ClientHello + key_share (ECDHE)
        ↓
ServerHello + key_share (ECDHE) + Certificate + CertificateVerify + Finished
        ↓
Finished
        ↓
应用数据(使用 ECDHE 派生的密钥加密)

工程实践中的安全要点

1. 参数验证

接收到的公钥必须验证:

  • 点是否在曲线上
  • 点不在无穷远点
  • 点的阶为 $n$(防止小子群攻击)
未验证公钥可导致无效曲线攻击(Invalid Curve Attack),攻击者通过发送不在正确曲线上的点来恢复受害者的私钥。

2. 私钥生成

  • 私钥必须使用密码学安全的随机数生成器(CSPRNG)
  • 私钥不能为 0 或 1
  • 私钥必须在 $[1, n-1]$ 范围内
  • 避免使用有偏的随机数(如简单的模运算偏差)

3. 密钥确认

基本 DH/ECDH 不提供密钥确认(key confirmation)—— 双方无法确认对方确实拥有正确的共享密钥。在 TLS 1.3 中,密钥确认通过以下方式实现:

  • 服务器证书验证(身份认证)
  • CertificateVerify 消息(证明服务器拥有私钥)
  • Finished 消息(确认双方派生密钥一致)

4. 侧信道防护

ECDH 实现必须抵抗侧信道攻击:

  • 时序攻击:标量乘法必须使用恒定时间算法(如 Montgomery ladder)
  • 功耗分析:需要盲化(blinding)或随机化技术
  • 缓存攻击:避免基于密钥的条件分支和查表

5. 0-RTT 与重放攻击

TLS 1.3 的 0-RTT 模式允许客户端在第一个往返中就发送数据,但面临重放攻击风险。缓解措施包括:

  • 服务器维护已接收的 0-RTT 数据的时间窗口
  • 客户端在 0-RTT 数据中不包含敏感操作
  • 使用单次使用的票据(obfuscated ticket age)

与国密算法的关系

在国密体系中,SM2 密钥交换协议(GM/T 0003.3)是 ECDH 的变体,包含额外的密钥确认和身份认证机制。SM2 密钥交换不仅协商共享密钥,还通过哈希值验证对方身份,提供比标准 ECDH 更强的安全保证。

国密 TLS(GM/T 0024)使用 SM2 证书和 SM4/SM3 算法,其密钥交换阶段基于 SM2 的 ECDH 变体。

参考来源

  • Diffie, W., & Hellman, M. (1976). New directions in cryptography. *IEEE Transactions on Information Theory*, 22(6), 644-654.
  • RFC 2631 — Diffie-Hellman Key Agreement Method
  • RFC 3526 — More Modular Exponential (MODP) Diffie-Hellman groups for Internet Key Exchange (IKE)
  • RFC 5246 — The Transport Layer Security (TLS) Protocol Version 1.2
  • RFC 7919 — Negotiated Finite Field Diffie-Hellman Ephemeral Parameters for Transport Layer Security (TLS)
  • RFC 8446 — The Transport Layer Security (TLS) Protocol Version 1.3
  • NIST SP 800-56A Rev. 3 — Recommendation for Pair-Wise Key-Establishment Schemes Using Discrete Logarithm Cryptography
  • NIST SP 800-57 Part 1 Rev. 5 — Recommendation for Key Management
  • SECG SEC 1 v2.0 — Elliptic Curve Cryptography
  • GM/T 0003.3-2012 — SM2 椭圆曲线公钥密码算法 第3部分:密钥交换协议
  • GM/T 0024-2023 SSL VPN 技术规范

相关实践