首页/安全/加密与证书速查/ECDH 椭圆曲线密钥协商
加密算法基础95 条

ECDH 椭圆曲线密钥协商

双方各自生成密钥对并交换公钥,各自计算得到相同共享秘密;有静态(固定密钥)与临时(ECDHE)两种用法,后者提供前向保密。

加密与证书速查安全更新于 2026-10-13

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 不提供前向保密:长期私钥一旦泄漏,配合已抓取的历史流量即可解密之前的会话。新系统应优先选择临时密钥交换方案,并在协议层面确保临时密钥每次新建。

易错点

  • 用静态 ECDH 承载长期业务:缺少前向保密,长期私钥泄漏会波及历史会话
  • 把共享秘密直接当对称密钥:缺少 KDF 派生环节,密钥用途混杂且熵分布不理想
  • 双方曲线或点格式不一致:协商直接失败,跨系统对接前需核对参数集
  • 自研实现省略公钥校验:特殊公钥可能诱导出可预测的共享秘密,成熟库已内置防护
  • 临时密钥复用或随机性不足:前向保密的实际强度下降,应使用密码学安全随机源

数据来源与参考

  • NIST SP 800-56A Rev.3(密钥协商)
  • RFC 7748
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌