文章目录
ECDH是一个非常重要且广泛应用的密码学协议,用于在不安全的通信通道上安全地生成一个共享的密钥。
一、什么是ECDH?
ECDH (Elliptic Curve Diffie-Hellman) 是一种基于椭圆曲线密码学(ECC)的密钥协商协议。它允许两个通信方在不安全的信道上,通过交换公开信息,独立地推导出一个相同的共享秘密(Shared Secret)。
该共享秘密通常作为对称加密算法(如AES)的密钥,用于加密后续的通信内容。
其安全性依赖于椭圆曲线离散对数问题(ECDLP) 的计算困难性:已知椭圆曲线上的点 G
和 k * G
,计算私钥 k
在计算上是不可行的。
二、为什么需要 ECDH?要解决什么问题?
想象一下,Alice 和 Bob 想在网上安全地聊天,但他们之间只有一个公开的、可能被窃听的网络(比如公共Wi-Fi)。
问题:
他们需要同一个密钥来用 AES 加密和解密消息。但如何把这个密钥通过不安全的网络传给对方?如果直接发送密钥,窃听者 Eve 也会得到它。解决方案:
使用 ECDH。他们不需要直接传递密钥本身,而是通过交换一些公开的信息,并结合自己私密的信息,各自独立地计算出同一个共享密钥。即使 Eve 听到了所有公开信息,她也无法计算出这个密钥。
这解决了密钥分发的难题。
三、原理与图示
ECDH的核心过程可以用下图清晰地展示。它完美地演绎了如何从公开的交换中产生一个私有的共享密钥。
数学原理:
结合律确保了双方计算的最终结果一致。
a * B = a * (b * G) = (a * b) * G = (b * a) * G = b * (a * G) = b * A
攻击者即使截获了公钥 A 和 B,由于无法解决ECDLP问题(从 A 求 a 或从 B 求 b),因此也无法计算出共享秘密 a * b * G
。
四、核心比喻:混合颜料
- 公共参数:双方使用相同的"黄色"颜料(椭圆曲线参数)
- 私密信息:Alice 选择"红色",Bob 选择"蓝色"(各自的私钥)
- 公开交换:
- Alice 发送"黄+红=橙红"(她的公钥)
- Bob 发送"黄+蓝=绿蓝"(他的公钥)
- 最终共享:
- Alice 计算"绿蓝+红=黄褐"(共享密钥)
- Bob 计算"橙红+蓝=黄褐"(共享密钥)
- 安全性:窃听者无法从公开的混合颜色中分离出原始私密颜色
五、技术实现步骤
1. 约定公共参数
- 选择相同的椭圆曲线(如 secp256k1、P-256)
- 确定曲线上的公共基点 G
2. 生成密钥对
Alice 端:
- 生成随机私钥
a
(大整数) - 计算公钥
A = a * G
(椭圆曲线标量乘法)
Bob 端:
- 生成随机私钥
b
(大整数) - 计算公钥
B = b * G
3. 交换公钥
- Alice 将公钥 A 发送给 Bob
- Bob 将公钥 B 发送给 Alice
4. 计算共享密钥
Alice 计算: S = a * B
Bob 计算: S = b * A
由于椭圆曲线乘法满足结合律:
a * B = a * (b * G) = b * (a * G) = b * A
5. 密钥派生
通常对共享点 S 的 x 坐标进行哈希处理,得到最终会话密钥(Session key)。
六、注意事项
事项 | 说明与建议 |
---|---|
曲线选择 (Curve Selection) | 使用标准化、广泛审计的曲线: • NIST 曲线: prime256v1 (P-256), secp384r1 (P-384)• 其他安全曲线: curve25519 (常用于现代协议如 Signal)避免使用冷门、未经验证或可能包含后门的曲线。 |
密钥派生函数 (KDF - Key Derivation Function) | 绝对不要直接使用原始共享秘密。 原始ECDH输出的字节串可能缺乏均匀熵分布。必须使用 HKDF 等密码学安全的KDF对其进行加工,以生成长度固定、随机性均匀的加密密钥材料。这是生产环境中的必须步骤。 |
前向保密 (Forward Secrecy) | 基础ECDH不天然具备前向保密。为实现FS(推荐),应使用 ECDHE (Ephemeral,短暂地),即每次会话都生成临时的密钥对。这样,即使攻击者获取了某一方的长期私钥,也无法解密过去的通信会话。 |
身份验证 (Authentication) | 基础ECDH易受中间人攻击 (MITM)。协议本身不验证公钥所属者的身份。 解决方案:必须结合数字签名(如ECDSA)或数字证书来对交换的公钥进行认证,确保你正在与预期的通信方而非攻击者建立密钥。 |
侧信道攻击 (Side-Channel Attacks) | 软件实现必须能够抵抗时序攻击(Timing Attacks)等侧信道攻击。使用像 OpenSSL、Libsodium 这样的成熟密码学库,而不是自己实现底层算法,这些库通常已经包含了针对此类攻击的防护。 |
随机数生成 (Random Number Generation) | 私钥 a 和 b 必须是密码学安全的真随机数。使用安全的随机数生成器(如 /dev/urandom 、CryptGenRandom、BCryptGenRandom)。弱的随机数生成会导致私钥被预测,整个协议安全形同虚设。 |
七、安全性基础
基于椭圆曲线离散对数问题(ECDLP) 的计算困难性:
- 已知公钥 A 和基点 G,计算私钥 a 在计算上不可行
- 即使攻击者截获所有公开参数(A, B, G),也无法计算出共享密钥 S
八、优势特点
特性 | 描述 |
---|---|
前向保密 | 每次会话使用临时密钥对,长期私钥泄露不影响历史会话安全 |
高效性 | 较短的密钥长度(256位)即可提供足够安全性,计算资源需求低 |
带宽友好 | 公钥尺寸小,适合带宽受限环境 |
九、典型应用场景
- TLS/SSL:保护 HTTPS 连接安全
- SSH:安全远程访问
- 加密消息:Signal、WhatsApp 等端到端加密
- 区块链:比特币/以太坊地址生成和交易签名
- VPN:WireGuard 等现代VPN协议
- 物联网:设备间安全通信
十、相关标准
- NIST 曲线系列:P-256、P-384、P-521
- 比特币曲线:secp256k1
- 国家标准:SM2(中国商用密码算法)
注意:实际应用中需要结合适当的哈希函数和密钥派生函数(如 HKDF)来从共享密钥派生出实际使用的加密密钥。