# Diffie-Hellman是什么？定义、例子与常见误区

> Diffie-Hellman 是 1976 年提出的密钥协商方法，让通信双方在公开信道上各自算出相同的共享秘密，而无需传输这个秘密本身。

Source: https://ssl.sh/zh/glossary/diffie-hellman/
Last updated: 2026-11-10

Diffie-Hellman 由 Whitfield Diffie 和 Martin Hellman 于 1976 年发表。经典的有限域形式中，双方共享公开的素数 p 和生成元 g；各自选一个私有数，发送 g 的该次幂模 p 的结果，再把收到的值用自己的私有数做幂运算，最终得到相同的结果。窃听者要想算出它，就得解离散对数问题。[ECDHE](https://ssl.sh/zh/glossary/ecdhe/) 是同一思路在椭圆曲线群上的版本。

## 为什么重要
每次连接都用新密钥的 Diffie-Hellman（DHE 或 ECDHE）是 TLS 实现[前向保密](https://ssl.sh/zh/glossary/forward-secrecy/)的基础。但它本身不认证身份：中间人可以分别和两端各做一次交换。TLS 的做法是让服务器用证书私钥对 DH 参数签名。群的大小同样关键：2015 年的 [Logjam](https://ssl.sh/zh/glossary/logjam/) 攻击表明，512 位出口级 DH 很快就能被破解，被大量服务器共用的 1024 位群也在资源充足的攻击者能力范围之内。

## 例子
用很小的数字演示一次交换（实际使用 2048 位以上的素数或椭圆曲线）：

```text
Public:  p = 23, g = 5
Alice:   a = 4   ->  A = 5^4 mod 23 = 4
Bob:     b = 3   ->  B = 5^3 mod 23 = 10
Alice:   B^a mod 23 = 10^4 mod 23 = 18
Bob:     A^b mod 23 = 4^3  mod 23 = 18   (shared secret)
```

双方都得到 18，而线路上只出现过 23、5、4、10 这几个公开值。

## 常见误区
- **Diffie-Hellman 负责加密数据。** 它只产生共享秘密，真正加密流量的是由此派生密钥的对称算法，比如 AES-GCM。
- **有了 DH 就不怕中间人。** 未经认证的 DH 可以被中间人劫持，身份认证要靠证书和签名。
- **自定义的超大 DH 群一定更好。** 标准的 2048 位群已被认为安全，更大的群会拖慢每次握手，而且现在多数服务器优先使用 ECDHE。

## 相关术语

- [ECDHE](https://ssl.sh/zh/glossary/ecdhe/): ECDHE 是椭圆曲线上的临时 Diffie-Hellman 密钥交换，TLS 双方每次握手都生成新的椭圆曲线密钥对，并据此协商出共享密钥。
- [DH 参数](https://ssl.sh/zh/glossary/dh-parameters/): DH 参数是定义有限域 Diffie-Hellman 群的大素数模数和生成元，TLS 服务器要提供 DHE 密码套件就必须配置它。
- [密钥交换](https://ssl.sh/zh/glossary/key-exchange/): 密钥交换是 TLS 握手中客户端与服务器建立共享秘密的步骤，保护连接的对称密钥都由这个共享秘密派生而来。
- [前向保密](https://ssl.sh/zh/glossary/forward-secrecy/): 前向保密是密钥交换的一种安全属性：即使服务器的长期私钥日后泄露，过去连接的会话密钥也不会因此暴露。
- [Logjam](https://ssl.sh/zh/glossary/logjam/): Logjam 是 2015 年公布的攻击（CVE-2015-4000），可把 TLS 降级到 512 位出口级 Diffie-Hellman，并威胁使用过小或被大量共用 DH 参数的服务器。
- [中间人攻击](https://ssl.sh/zh/glossary/man-in-the-middle/): 中间人攻击是指攻击者暗中插入通信双方之间，转发并可能篡改流量，而双方都以为自己在直接和对方通信。
