ECDH (椭圆曲线迪菲-赫尔曼密钥交换)

发布于:2025-09-03 ⋅ 阅读:(21) ⋅ 点赞:(0)



ECDH是一个非常重要且广泛应用的密码学协议,用于在不安全的通信通道上安全地生成一个共享的密钥

一、什么是ECDH?

ECDH (Elliptic Curve Diffie-Hellman) 是一种基于椭圆曲线密码学(ECC)的密钥协商协议。它允许两个通信方在不安全的信道上,通过交换公开信息,独立地推导出一个相同的共享秘密(Shared Secret)。
该共享秘密通常作为对称加密算法(如AES)的密钥,用于加密后续的通信内容。

其安全性依赖于椭圆曲线离散对数问题(ECDLP) 的计算困难性:已知椭圆曲线上的点 Gk * G,计算私钥 k 在计算上是不可行的。

二、为什么需要 ECDH?要解决什么问题?

想象一下,Alice 和 Bob 想在网上安全地聊天,但他们之间只有一个公开的、可能被窃听的网络(比如公共Wi-Fi)。

  1. 问题:
    他们需要同一个密钥来用 AES 加密和解密消息。但如何把这个密钥通过不安全的网络传给对方?如果直接发送密钥,窃听者 Eve 也会得到它。

  2. 解决方案:
    使用 ECDH。他们不需要直接传递密钥本身,而是通过交换一些公开的信息,并结合自己私密的信息,各自独立地计算出同一个共享密钥。即使 Eve 听到了所有公开信息,她也无法计算出这个密钥。

这解决了密钥分发的难题。

三、原理与图示

ECDH的核心过程可以用下图清晰地展示。它完美地演绎了如何从公开的交换中产生一个私有的共享密钥。

Bob
不安全的公共通道
Alice
生成私钥 b
计算公钥 B = b * G
计算 S = b * A
A
B
生成私钥 a
计算公钥 A = a * G
计算 S = a * B
共享密钥 S = a * b * G

数学原理:
结合律确保了双方计算的最终结果一致。
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

四、核心比喻:混合颜料

  1. 公共参数:双方使用相同的"黄色"颜料(椭圆曲线参数)
  2. 私密信息:Alice 选择"红色",Bob 选择"蓝色"(各自的私钥)
  3. 公开交换
    • Alice 发送"黄+红=橙红"(她的公钥)
    • Bob 发送"黄+蓝=绿蓝"(他的公钥)
  4. 最终共享
    • Alice 计算"绿蓝+红=黄褐"(共享密钥)
    • Bob 计算"橙红+蓝=黄褐"(共享密钥)
  5. 安全性:窃听者无法从公开的混合颜色中分离出原始私密颜色

五、技术实现步骤

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) 私钥 ab 必须是密码学安全的真随机数。使用安全的随机数生成器(如 /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)来从共享密钥派生出实际使用的加密密钥。


网站公告

今日签到

点亮在社区的每一天
去签到