一句话先说清
ECDH(Elliptic Curve Diffie-Hellman)是公钥密码里最优雅的魔术之一:A 随机选一个私钥 a,公钥是曲线上基点 G 的 a 倍点;B 同样生成 b 与 bG。双方只交换公钥,然后各自做乘法——A 算 a 乘 bG,B 算 b 乘 aG。因为标量乘法满足交换律,两人都得到同一个点 abG,把这个点哈希一下就是共享秘密。全程没有一条消息写着“这把钥匙”,窃听者只见两堆曲线点,想从公钥反推私钥等价于解椭圆曲线离散对数问题。

从 1976 年的论文到椭圆曲线
Diffie 与 Hellman 在 1976 年发表的密码学开山论文提出了原始密钥交换:在有限域上互发 g 的幂次,双方拼出同一把共享密钥,首次证明“加密可以先商量密钥”。1985 年 Miller 与 Koblitz 分别把这套思想搬到椭圆曲线上,用曲线点群替代整数乘法群——同样的交换律,但同等安全强度下密钥短得多:约 256 位的曲线密钥大致对应三千多位的 RSA 强度。今天 TLS 连接、WireGuard 隧道、比特币的 BIP324 v2 版本 P2P 加密层、闪电网络 BOLT8 传输层,握手阶段都能看到 ECDH 的身影。
它不回答“你是谁”
ECDH 有一条必须刻在脑子里的边界:协商过程不验证对方身份。中间人完全可以与 A 协商一把钥匙、与 B 协商另一把,然后居中转发并分别解密——协议本身毫不知情。解决方案是把 ECDH 塞进一个带认证的外壳:TLS 用证书与签名证明公钥归属;加密钱包与节点之间常用静态密钥加签名握手实现“只有对方私钥持有者能算出这把钥匙”的绑定(如 Noise 协议框架的多种握手模式)。另一个要点是临时性:现代连接协议普遍使用“临时 ECDH”(ECDHE),每次会话现生成一次性密钥对,会话密钥泄露也无法解密历史流量——这就是常被提及的前向保密。
X25519 与曲线工程
Curve25519 是如今最常见的落地选择之一:设计者 Bernstein 把它做成一个只接受 32 字节输入、输出 32 字节共享秘密的函数 X25519,快、无分支、天然免疫一类让曲线实现频频翻车的“无效曲线攻击”,WireGuard 与许多 TLS 套件就用它。比特币走了另一条路:BIP324 的 v2 加密传输刻意复用 secp256k1 做 ECDH——官方理由是不引入新曲线、把密码学假设压到最少——并配合 ElligatorSwift 编码把公钥伪装成随机字节流以增强抗审查性,加密层用 ChaCha20Poly1305。以太坊的-devp2p ECIES 与 Noise 家族则是第三种画风:secp256k1 与多种曲线分工使用。闪电网络的 BOLT8 传输握手则是混合分工:临时密钥交换走 Curve25519,握手第二步额外对对方的 secp256k1 节点身份公钥做一次 ECDH,把隧道与节点身份绑在一起。选型口诀:同一条曲线上签名与协商各司其职没问题,但绝不要自造参数。
一次握手的完整节拍
把典型流程走一遍:A 生成临时私钥 a,把公钥 aG 连同握手消息发出;B 同样生成 b 并回赠 bG;双方各自计算共享点,再交给密钥派生函数(KDF)压成对称密钥,之后的流量就交给 AEAD 类对称加密。整个过程中“密钥”三个字从未出现在任何报文里。要注意工程细节:共享点通常只取横坐标再哈希,避免直接暴露点的完整表示;重放保护靠握手里的随机数与序列号;把这些零件系统化打包的就是 Noise 协议框架——现代 P2P 协议(包括比特币的 v2 加密传输)多数能看成 Noise 思路的实例化。
快速问答
问:为什么窃听者算不出 abG?知道 G、aG、bG 求 abG 是“计算性 Diffie-Hellman 问题”,目前没有已知的经典算法能在可行时间内解决;量子计算机的 Shor 算法则构成远期威胁,这也是各方后量子迁移清单上的必换项。 问:ECDH 能直接当签名用吗?不能,它只产生共享秘密;签名需要另一族算法(ECDSA、EdDSA 等),职责分开。 问:一把共享秘密能用多久?工程惯例是“用完即弃”:每次握手重新协商,长会话再定期滚新密钥(ratchet 棘轮机制),这把泄露面持续缩小。
常见误区
一是把“交换密钥”理解成“发送密钥”:没有任何一方发出钥匙,双方只是各算各的,秘密从未在链路上传输过。二是以为 ECDH 自带身份认证:不加签名与证书的裸 ECDH 恰好是教科书级中间人攻击的靶子。三是把曲线参数当成可选项:选错曲线(或自造曲线参数)引入的侧信道与群结构风险,远比换算法本身的代价高,应跟随成熟协议用曲线。
风险提示:本文为密码学科普,不构成任何投资建议;涉及密钥管理请遵循所用钱包与协议的官方文档。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。