ECDH 是什么
ECDH(Elliptic Curve Diffie-Hellman)是椭圆曲线上的密钥协商:双方各自生成密钥对、交换公钥,然后用自己的私钥与对方公钥计算出相同的共享秘密。它有静态(密钥长期固定)与临时(每次会话新建)两种用法,后者即 ECDHE,能够提供前向保密。
基本信息
| 原理 | 共享点等于自己的私钥乘以对方公钥 |
|---|---|
| 变体 | 静态 ECDH(固定密钥)、临时 ECDHE(每次会话新建) |
| 输出 | 曲线上点的坐标,需再经 KDF 派生密钥 |
| 常用曲线 | P-256、P-384、X25519、SM2 |
| 是否加密 | 只协商密钥,不加密数据也不做签名 |
| 配套使用 | 与签名算法(如 ECDSA、RSA)配合完成身份认证 |
典型使用场景
- TLS 握手:用 ECDHE 协商会话密钥,配合证书完成身份认证
- 端到端加密协议:双方协商会话密钥后再用对称算法通信
- 设备配对:两个设备首次连接时协商共享密钥
- SSH 密钥交换:curve25519 等算法即基于此思路
- 密钥分发:作为混合加密体系中的密钥协商环节
Python 示例(cryptography)
Python 示例(cryptography)
from cryptography.hazmat.primitives.asymmetric import ec
# 双方各自生成密钥对
a = ec.generate_private_key(ec.SECP256R1())
b = ec.generate_private_key(ec.SECP256R1())
# 用自己私钥与对方公钥计算共享秘密,结果相同
ss_a = a.exchange(ec.ECDH(), b.public_key())
ss_b = b.exchange(ec.ECDH(), a.public_key())
assert ss_a == ss_b # 32 字节共享秘密
# 共享秘密不能直接当密钥:需经 HKDF 等 KDF 派生
静态与临时对照
| 维度 | 静态 ECDH | 临时 ECDHE |
|---|---|---|
| 密钥生命周期 | 长期固定 | 每次会话新建并销毁 |
| 前向保密 | 无 | 有 |
| 性能 | 省去密钥生成 | 每次会话多一次密钥生成 |
| 典型用途 | 特定协议与老标准 | TLS 1.3 与安全基线要求 |
| 风险 | 长期私钥泄漏影响历史会话 | 实现需保证临时密钥随机且不复用 |
协商出的共享秘密是曲线上的点坐标,通常再经 HKDF 等 KDF 派生出多条用途分离的密钥(如发送方向、接收方向、认证密钥)。直接把共享秘密当对称密钥使用,会导致密钥熵分布不均与用途混淆。
静态 ECDH 不提供前向保密:长期私钥一旦泄漏,配合已抓取的历史流量即可解密之前的会话。新系统应优先选择临时密钥交换方案,并在协议层面确保临时密钥每次新建。