问答摘要
1) TLS 1.2 与 TLS 1.3 握手主要区别
- 往返次数(延迟):
- TLS 1.2:典型 2-RTT。
- TLS 1.3:典型 1-RTT,合并多条握手消息,显著降延迟。
- 密钥交换与算法:
- TLS 1.2:支持 RSA 密钥传输、(EC)DHE 等;含大量遗留套件。
- TLS 1.3:移除静态 RSA/旧套件,仅保留具有前向保密的 (EC)DHE;对称算法限定为 AEAD(如 AES-GCM、ChaCha20-Poly1305)。
- 安全与简化:
- 移除易错或弱项(如压缩、RC4、SHA-1 等)、重协商逻辑简化、握手消息更少,默认更安全。
- 消息流变化:
- ClientHello 内直接携带密钥分享(key_share)。
- 服务器尽早发送证书与 Finished,减少往返。
2) TLS 1.3 如何实现 0-RTT(早期数据)
- 前提:客户端持有与服务器的会话恢复材料(PSK/Session Ticket)。
- 过程:客户端在 ClientHello 中携带 PSK 与 early_data 扩展,并用基于上次会话派生的“早期密钥”加密应用数据;服务器接受则直接处理,同时继续 1-RTT 完整握手。
- 风险与限制:0-RTT 数据可被重放,且不具前向保密;建议仅用于幂等请求(例如 HTTP GET)。
3) ECDH 与比特币的关联
- 共同基础:都基于椭圆曲线密码学(ECC),比特币使用曲线 secp256k1。
- 用途不同:
- 比特币链上主要用 ECDSA(签名/验签,保证交易真实性)。
- ECDH 用于密钥协商(产生共享密钥,加密通信)。
- 生态中的使用:链下/协议层(例如部分钱包间加密、隐私方案、闪电网络等)会用 ECDH 协商共享密钥,实现点对点保密通道或隐身地址派生等。
4) 缩写
- ECDH:Elliptic Curve Diffie–Hellman(椭圆曲线 Diffie–Hellman 密钥交换)
- ECC:Elliptic Curve Cryptography(椭圆曲线密码学)
- 相关:ECDSA(Elliptic Curve Digital Signature Algorithm,椭圆曲线数字签名算法)
ECDH 原理详解
A. 背景与数学基础
- 核心难题:椭圆曲线离散对数问题(ECDLP)。已知基点 G 与点 Q=dG,想从 Q 求 d 在计算上困难。
- 曲线与群:
- 定义在有限域 𝔽_p 上的椭圆曲线 E:y² = x³ + ax + b(判别式 Δ ≠ 0 保证非奇异)。
- 有限点集(含无穷远点 𝒪)构成阿贝尔群,加法是几何“弦切法”,标量乘法 dG 表示重复加法。
- 公共参数(domain parameters):
- 素域模数 p,曲线系数 a、b,基点 G,基点阶 n(通常是大素数),余因子 h(#E(𝔽_p) = n·h)。
- 实务上常选 h=1 的曲线以简化子群问题(secp256k1 的 h=1)。
B. 密钥对与共享秘密
- 钥匙生成(任一参与方):
- 私钥 d ∈ [1, n−1] 的均匀随机数。
- 公钥 Q = dG(曲线点)。
- 交换过程(Alice 与 Bob):
- Alice:私钥 a、公钥 A=aG;Bob:私钥 b、公钥 B=bG。
- 共享点 S 的计算:
- Alice 计算 S = aB = a(bG) = (ab)G
- Bob 计算 S = bA = b(aG) = (ab)G
- 由于群交换律,双方得到相同的曲线点 S,称为共享秘密(严格来说是共享曲线点)。
- 关键结论:观察者即使知道 A、B 也难以从中恢复 a 或 b,更无法计算 (ab)G,安全性基于 ECDLP 困难性。
C. 从曲线点到对称密钥:KDF
- 直接把曲线点 S 作为对称密钥不安全/不规范。通常取其 x 坐标或经编码作为 KDF 输入。
- 常见做法:使用 HKDF(如基于 SHA-256)
- PRK = HKDF-Extract(salt, IKM = x(S) || context)
- K = HKDF-Expand(PRK, info, L)
- 上下文/标签用于区分用途、防止密钥重复使用。TLS 1.3 使用 HKDF 并定义明确标签、上下文绑定。
D. 安全性质与变体
- 前向保密(PFS):
- 若每次会话使用新的临时密钥对(Ephemeral ECDH,简称 ECDHE),则长期私钥泄露也无法解密过去会话。
- 静态 ECDH(长期密钥复用)不具备前向保密。
- 抗重放/认证:
- 纯 ECDH 不提供“认证”,需要结合签名或认证密钥包装(例如 TLS 握手中由证书和握手 transcript 绑定完成实体认证)。
- 曲线选择:
- 常见:secp256r1(P-256,NIST)、secp256k1(比特币)、X25519/X448(Montgomery 曲线,RFC 7748,工程上更易做常数时间实现)。
- 安全强度:
- 约略等效:256-bit 曲线私钥 ≈ 128-bit 对称安全强度(例如 P-256、secp256k1)。
E. 实现要点与常见陷阱
- 公钥验证(至关重要):
- 检查公钥不是无穷远点 𝒪;
- 点在曲线上:满足曲线方程;
- 子群检查/余因子清除:避免小子群攻击(h>1 的曲线尤需注意;secp256k1 的 h=1 更简单)。
- 常数时间防侧信道:
- 标量乘法采用常数时间算法(如 Montgomery ladder / 固定窗口),避免时序/功耗泄露。
- 随机性质量:
- 私钥/临时密钥必须使用强随机;
- 绝不可复用临时密钥(会破坏前向保密,甚至泄露长期密钥)。
- 点压缩与编码:
- SEC1 定义的未压缩/压缩格式;解析时必须严格校验,防“无效曲线”攻击。
- KDF 与密钥区分:
- 不同用途应使用不同“info/label/context”,做到密钥分离。
F. 与协议/系统的衔接
- TLS 1.3:
- 使用 ECDHE(即 ECDH 的“临时密钥”变体)作为默认密钥协商机制;
- 客户端在 ClientHello 通过 key_share 发送公钥;服务器回传对应公钥;双方用 HKDF 从共享点派生握手密钥、应用密钥。
- 比特币/加密货币生态:
- 链上签名:使用 ECDSA(同曲线基础,不是密钥交换)。
- 链下/隐私方案:钱包间可用(secp256k1 上的)ECDH 派生共享密钥,用于加密消息、派生一次性地址(如隐身地址/部分付款码方案等)。
- 闪电网络等二层协议:建立加密通道时采用基于 ECDH 的密钥协商(具体实现依协议套件,常与 Noise/HKDF 组合)。
G. 直观小示例(伪代码)
# 域参数:secp256k1 (p, a, b, G, n, h=1)
# Alice 生成
a = RandomInt(1, n-1)
A = ScalarMult(a, G) # 公钥
# Bob 生成
b = RandomInt(1, n-1)
B = ScalarMult(b, G) # 公钥
# 交换 A, B(公开可见)
# 计算共享点
S_A = ScalarMult(a, B) # Alice 侧:a * B = (ab)G
S_B = ScalarMult(b, A) # Bob 侧:b * A = (ab)G
assert S_A == S_B
# 提取 x 坐标作为 KDF 输入
ikm = XCoord(S_A) || context
# 使用 HKDF-SHA256 派生对称密钥(长度 L)
prk = HKDF-Extract(salt, ikm)
K = HKDF-Expand(prk, info, L)
要点:
- 公开交换仅为曲线点公钥 A、B;
- 真正用于对称加密的并非曲线点本身,而是经 KDF 派生出的密钥材料;
- 在认证场景(如 TLS)中,握手会将身份、参数、transcript 一并绑定,防中间人攻击。
H. 简短“为何可行”的数学直觉
- 群交换性保证 a(bG) = b(aG);
- 对攻击者而言,从 G、A=aG、B=bG 推出 (ab)G 的有效方法等价于解决 ECDLP(当前被认为计算上不可行);
- 因此,双方可公开交换公钥而不泄露共享秘密。
术语速查
- ECC:Elliptic Curve Cryptography(椭圆曲线密码学)
- ECDH:Elliptic Curve Diffie–Hellman(椭圆曲线密钥交换)
- ECDHE:Ephemeral ECDH(临时密钥的 ECDH,具前向保密)
- ECDSA:Elliptic Curve Digital Signature Algorithm(椭圆曲线数字签名)
- KDF:Key Derivation Function(密钥派生函数)
- HKDF:HMAC-based KDF(常见标准化 KDF,TLS 1.3 采用)
- ECDLP:Elliptic Curve Discrete Logarithm Problem(椭圆曲线离散对数问题)