3、密钥协商协议概述:Diffie-Hellman、ECDH、MQV

密钥协商,说白了就是让两方在不安全的网络里,悄悄算出同一个秘密。联邦学习场景下,客户端和服务器每次通信都要靠它保护梯度数据。我早期做项目时,对这块理解不够深,直接用了一个固定密钥……后来想想,幸亏只是内部测试,不然中间人攻击分分钟把模型参数扒干净。

这一节,我会把三个主流协议——Diffie-Hellman、ECDH 和 MQV 讲透。你不需要死记公式,重点理解它们的核心思路、适用场景,以及常见坑点。

3.1 Diffie-Hellman(DH)—— 老祖宗级别的思想

DH 是 1976 年提出的,至今仍是很多现代协议的基础。它的核心思路是利用模幂运算的单向性:计算 g^a mod p 很容易,但知道 g^a 和 g,反推 a 就难了。

典型的 DH 流程是:

  1. 双方约定一个大素数 p 和生成元 g(公开参数)
  2. 各自生成随机私钥 a 和 b
  3. 计算公钥 A = g^a mod p,B = g^b mod p,并交换
  4. 各自计算共享密钥 K = B^a mod p = A^b mod p = g^(ab) mod p

这里有个容易忽略的点:DH 本身没有身份认证。我在一个金融项目中就踩过这个坑——攻击者冒充服务器,与客户端完成了 DH 交换,结果密钥被截获。所以后面才有了签名版的 DHE,或者直接上 MQV。

小提示:DH 的参数 p 至少 2048 位,g 一般选 2 或 5。别用 1024 位,现在算力下已经不够安全了。

3.2 ECDH —— 用椭圆曲线给 DH 瘦身

ECDH 是 DH 的椭圆曲线版。它把模幂运算换成了椭圆曲线上的点乘运算。说白了,DH 用的大整数域换成了椭圆曲线群。好处是密钥长度可以大幅缩短,比如 256 位的 ECDH 安全强度就约等于 3072 位的 DH。

联邦学习的客户端通常资源受限,我建议优先考虑 ECDH。它一次握手的数据量更小,对移动端更友好。

ECDH 的流程与 DH 很相似,只是符号变了:

  • 选定椭圆曲线参数(如 secp256r1 或 X25519)
  • 私钥 d 是一个随机整数,公钥 Q = d * G(G 是基点)
  • 交换公钥后,各自计算共享点 S = d_a * Q_b = d_b * Q_a,取 x 坐标作为密钥

这里有一个我亲自处理过的坑:有一次客户端和服务器的曲线参数不一致,导致算出来的共享点结构不同,通信直接失败。后来我强制在配置里声明曲线 OID,才彻底解决。

3.3 MQV —— 给密钥协商加上“防伪标签”

MQV(Menezes-Qu-Vanstone)是在 DH 基础上加入身份认证的协议。它把参与方的长期公钥和临时公钥一起混合计算,使得攻击者无法通过中间人攻击篡改消息。

MQV 的计算稍微复杂一些,但核心思路是这样的:

  1. 双方各自有长期密钥对 (sk_long, pk_long) 和临时密钥对 (sk_ephem, pk_ephem)
  2. 交换临时公钥后,用长期私钥和临时私钥混合签名计算共享密钥
  3. 公式里引入了“隐式认证”,不需要额外签名步骤

我记得在《密码学与网络安全》教材里,MQV 被标记为“专利保护算法”。实际项目中如果要用它,得先确认许可证。我更建议用标准化的 HMQV(Hashed MQV),它在性能和安全证明上更成熟。

注意:MQV 虽然能防中间人,但实现复杂度高。联邦学习中如果两端都是可信服务器(比如在同一 VPC 内),用 ECDH 加上外部签名就够了。别为了炫技上 MQV,增加无谓的延迟。

3.4 三种协议对比一览

特性 DH ECDH MQV
基础数学 模幂运算(大整数域) 椭圆曲线点乘 同左,但混合公私钥
密钥长度(同等安全) 3072 位 256 位 256 位(使用 ECC)
身份认证 无 无 隐式认证
抗中间人攻击 弱(需额外签名) 弱 强(原生支持)
计算开销 中 低 中高
联邦学习推荐度 低(过时) 高 低(复杂度高)
我的建议:新项目无脑选 ECDH(曲线优先 X25519)。只在需要“无额外签名”的认证场景才考虑 MQV,而且务必使用标准化实现,别自己造轮子。

3.5 知识体系图

下面的 SVG 图展示了三种协议的关系与核心差异。你可以把它当作选型时的直觉参考:

密钥协商协议家族 Diffie-Hellman 模素数离散对数 ECDH 椭圆曲线离散对数 MQV / HMQV 隐式认证 共享密钥 K 安全性:MQV > ECDH > DH(同等密钥长度) 联邦学习推荐:ECDH + 外部签名 说明:DH 是基础,ECDH 是其椭圆曲线变体,MQV 在 ECDH 上增加了隐式认证。

3.6 实战中的选型建议

如果你现在要做一个联邦学习密钥协商模块,我建议这样考虑:

  • 默认选项:ECDH(X25519),搭配 TLS 1.3。性能好,标准成熟。
  • 需要抗量子攻击:暂时先用 ECDH,后续可以平滑升级到 ML-KEM(即 Kyber),前提是标准定稿。
  • 不能接受中间人:在 ECDH 之上加一次签名认证(比如 Ed25519),不要自己实现 MQV。
  • 遗留系统只有 DH:尽快升级到 ECDH,参数 p 至少 2048 位,且确保使用临时密钥(DHE),避免静态 DH。