EdDSA 数字签名算法原理详解:从 Edwards 曲线到 FIPS 186-5 标准化
概述
EdDSA(Edwards-Curve Digital Signature Algorithm) 是 21 世纪最重要的数字签名创新之一。它由密码学家 Daniel J. Bernstein 领导设计,于 2017 年 1 月在 RFC 8032 中正式标准化,并在 2023 年 2 月被纳入 FIPS 186-5(数字签名标准),成为美国政府认可的三大签名方案之一(与 ECDSA、RSA 并列)。
EdDSA 的核心优势在于其确定性(Deterministic)设计——签名过程不需要随机数生成器,彻底消除了 ECDSA 因随机数质量不佳导致的私钥泄露风险(如 2010 年 Sony PS3 的 ECDSA 随机数重用攻击)。同时,EdDSA 基于 Edwards 曲线的完备加法公式,天然抵抗时序侧信道攻击,签名速度远超 ECDSA,验签速度也极具竞争力。
如今,EdDSA 已深度融入现代安全基础设施:TLS 1.3(Ed25519 作为推荐密钥交换曲线)、SSH(Ed25519 公钥)、Signal 协议(XEd25519 用于端到端加密)、区块链(Solana、Polkadot、Stellar 使用 Ed25519 作为默认签名方案)、以及 W3C 可验证凭证标准。
本文将从数学基础出发,系统解析 EdDSA 的完整设计:Edwards 曲线的群结构、Ed25519/Ed448 的参数选择、签名与验签算法、安全性证明思路,以及与 ECDSA、Schnorr 的对比分析。
Edwards 曲线的数学基础
曲线方程
EdDSA 使用的 Edwards 曲线具有如下形式:
$$ -x^2 + y^2 = 1 + dx^2y^2 $$
其中 $d$ 是非零且非平方的域元素。更一般地,扭曲 Edwards 曲线(Twisted Edwards Curve) 的形式为:
$$ ax^2 + y^2 = 1 + dx^2y^2 $$
当 $a = 1$ 时为标准 Edwards 曲线,当 $a = -1$ 时为负 Edwards 曲线(Ed25519 使用 $a = -1$ 的负 Edwards 曲线)。
完备加法公式
Edwards 曲线的核心优势在于其加法公式是完备的(Complete)——即公式对所有输入点对都有效,无需处理特殊情况(如点加倍、无穷远点)。
对于扭曲 Edwards 曲线 $ax^2 + y^2 = 1 + dx^2y^2$,两点 $(x_1, y_1)$ 和 $(x_2, y_2)$ 相加得到 $(x_3, y_3)$:
$$ x_3 = \frac{x_1y_2 + y_1x_2}{1 + dx_1x_2y_1y_2}, \quad y_3 = \frac{y_1y_2 - ax_1x_2}{1 - dx_1x_2y_1y_2} $$
完备性条件:当 $a$ 是域中的非平方元素、$d$ 是非平方元素时,分母永不为零。这意味着:
- 不需要条件分支判断"两点是否相同"
- 不需要处理"无穷远点"特殊情况
- 所有输入使用同一套公式,天然抵抗时序侧信道攻击
与 Weierstrass 曲线的关系
Edwards 曲线与常用的 Weierstrass 曲线(如 NIST P-256、secp256k1)之间存在双有理等价(Birational Equivalence)。具体地,Curve25519(Montgomery 形式,用于 ECDH)与 Edwards25519 是双有理等价的,这意味着它们具有相同的代数结构和安全性。
Ed25519 参数
Ed25519 是 EdDSA 在 Edwards25519 曲线上的实例化:
$$ -x^2 + y^2 = 1 - \frac{121665}{121666}x^2y^2 $$
定义在素数域 $\mathbb{F}_p$ 上,其中 $p = 2^{255} - 19$。
| 参数 | 值 |
|---|---|
| 素数 $p$ | $2^{255} - 19$(59 位十六进制) |
| 曲线方程 | $-x^2 + y^2 = 1 - \frac{121665}{121666}x^2y^2$ |
| 余因子(Cofactor) | $c = 8$ |
| 基点 $B$ | 唯一 $y > 0$ 且 $y$ 为偶数的点 |
| 子群阶 $\ell$ | $2^{252} + 27742317777372353535851937790883648493$(素数) |
| 私钥长度 | 256 位(32 字节) |
| 公钥长度 | 256 位(32 字节) |
| 签名长度 | 512 位(64 字节) |
| 哈希函数 | SHA-512 |
私钥 Clamping
Ed25519 的私钥处理包含一个关键步骤——Clamping,它确保标量乘法在正确的子群中进行:
给定 32 字节私钥种子 $k$,计算标量 $s$:
- 计算 $h = \text{SHA-512}(k)$(64 字节)
- 取 $h[0:32]$ 作为低位部分,进行 clamping:
- 将 $h[0:32]$ 解释为小端序整数 $s$,作为私钥标量
- 低 3 位清零 → 标量是 8 的倍数 → 标量乘法结果在素数阶子群中
- 次高位设为 1 → 标量足够大 → 抵抗小标量攻击
签名与验签算法
密钥生成
私钥: 随机 32 字节 k
h = SHA-512(k) // 64 字节
s = clamp(h[0:32]) // 私钥标量(小端序)
A = [s]B // 公钥(Edwards 曲线上的点)公钥 $A$ 是基点 $B$ 的 $s$ 倍标量乘法。
签名算法
EdDSA 签名是确定性的——相同的消息和私钥总是产生相同的签名。
输入: 私钥种子 k, 消息 M
输出: 签名 (R, S)(共 64 字节)
1. h = SHA-512(k) // 64 字节
2. s = clamp(h[0:32]) // 私钥标量
3. prefix = h[32:64] // 第二部分哈希,用于确定性 nonce
4. r = SHA-512(prefix || M) // 确定性 nonce(模 ℓ)
5. R = [r]B // 签名第一部分
6. h = SHA-512(R || A || M) // 挑战哈希
7. S = (r + h * s) mod ℓ // 签名第二部分
8. 输出 (R, S)关键设计:
- 确定性 nonce:$r$ 由私钥和消息确定性派生,不需要随机数生成器。这彻底消除了 ECDSA 的随机数重用风险。
- 挑战哈希:$h = H(R, A, M)$ 将签名与公钥和消息绑定,防止签名伪造。
验签算法
输入: 公钥 A, 消息 M, 签名 (R, S)
输出: 有效 / 无效
1. 解码 R 和 A 为曲线点
2. 解码 S 为整数
3. h = SHA-512(R || A || M)
4. 验证: [S]B == R + [h]A
即: [s]B == [r]B + [h * s]B == [r + h*s]B验签等式推导: $$ [S]B = [r + h \cdot s]B = [r]B + [h \cdot s]B = R + [h]A $$
Ed448(Goldilocks)
Ed448 是 EdDSA 在 Edwards448 曲线上的实例化,提供约 224 位安全级别:
| 参数 | Ed25519 | Ed448 |
|---|---|---|
| 素数 $p$ | $2^{255} - 19$ | $2^{448} - 2^{224} - 1$ |
| 安全级别 | ~128 位 | ~224 位 |
| 余因子 | 8 | 4 |
| 哈希函数 | SHA-512 | SHAKE256(114 字节输出) |
| 签名长度 | 64 字节 | 114 字节 |
安全性分析
EUF-CMA 安全
EdDSA 在随机预言机模型(Random Oracle Model)下被证明具有存在不可伪造性(EUF-CMA)——即攻击者无法在适应性选择消息攻击下伪造有效签名。
安全性依赖于:
- ECDLP 困难性:在 Edwards 曲线上求解离散对数在计算上不可行
- 哈希函数的抗碰撞性:SHA-512/SHAKE256 的抗碰撞和前像攻击能力
- 确定性 nonce:消除了随机数重用风险
侧信道防护
EdDSA 的侧信道防护是内置的,而非外加的:
- 完备加法公式:所有点加法使用同一公式,无分支 → 抵抗时序攻击
- 确定性签名:无随机数生成器 → 抵抗 RNG 故障攻击
- 固定时间标量乘法:使用 Montgomery ladder 或双标量乘法技术,运算时间与标量值无关
与 ECDSA 的对比
| 维度 | ECDSA | EdDSA |
|---|---|---|
| 签名随机性 | 需要随机 nonce | 确定性(无需随机数) |
| 签名速度 | 较慢(需模逆) | 较快(无模逆) |
| 验签速度 | 较快(单标量乘法) | 稍慢(双标量乘法) |
| 侧信道防护 | 需要额外实现 | 内置(完备加法公式) |
| 签名长度 | 64-72 字节(DER 编码) | 64 字节(固定) |
| 公钥恢复 | 支持 | 不支持 |
| 标准化 | FIPS 186-5, ANSI X9.62 | RFC 8032, FIPS 186-5 |
与 Schnorr 签名的关系
EdDSA 是 Schnorr 签名在 Edwards 曲线上的变体。经典 Schnorr 签名定义在任意循环群上:
$$ \text{签名: } (e, s), \quad e = H(R \| M), \quad s = r + e \cdot x $$
EdDSA 与 Schnorr 的主要区别:
- 曲线选择:EdDSA 使用 Edwards 曲线(完备加法),Schnorr 可使用任意曲线
- 挑战哈希输入:EdDSA 的 $h = H(R \| A \| M)$ 包含公钥 $A$,防止密钥替换攻击
- 确定性 nonce:EdDSA 的 $r$ 由私钥和消息确定,Schnorr 通常需要随机 nonce
工程实践要点
密钥生成
import os
import hashlib
def ed25519_generate_keypair():
# 生成 32 字节随机私钥种子
private_seed = os.urandom(32)
# 计算 SHA-512 哈希
h = hashlib.sha512(private_seed).digest()
# Clamping
a = bytearray(h[:32])
a[0] &= 0xF8 # 清除低 3 位
a[31] &= 0x7F # 清除最高位
a[31] |= 0x40 # 设置次高位
# 公钥 = [a]B(需要椭圆曲线标量乘法)
# 实际实现使用 curve25519 库
return private_seed, a签名验证注意事项
- 子群检查:验签时必须验证 $R$ 和 $A$ 在正确的素数阶子群中(即 $[8]R \neq \mathcal{O}$ 且 $[8]A \neq \mathcal{O}$),否则可能受到小子群攻击
- 等式验证:必须验证 $[8][S]B = [8]R + [8][h]A$(乘以余因子 8),防止余因子相关的攻击
- 公钥验证:接收方应验证公钥不是恒等元(无穷远点)
常见陷阱
- 确定性 nonce 的误用:EdDSA 的确定性设计意味着同一消息总是产生相同签名。如果需要概率签名(如某些区块链场景),应使用 ECDSA 或添加额外随机性
- 哈希函数混淆:Ed25519 使用 SHA-512,Ed448 使用 SHAKE256,不能混用
- 私钥种子 vs 私钥标量:32 字节种子经过 clamping 后才成为标量。直接随机生成 32 字节作为标量是错误的
- 公钥编码:Ed25519 公钥是 32 字节的小端序 $y$ 坐标 + 符号位,不是 DER 编码
标准化历程
RFC 8032(2017 年 1 月)
RFC 8032 由 Simon Josefsson 和 Ilari Liusvaara 发布,定义了 EdDSA 算法规范,包括:
- Ed25519 和 Ed448 的参数
- 签名和验签算法
- 测试向量
FIPS 186-5(2023 年 2 月)
FIPS 186-5 是美国政府数字签名标准的第五版,于 2023 年 2 月 3 日发布。该版本:
- 正式批准 EdDSA 作为标准签名方案
- 移除了 DSA(原始版本),因其使用量不足且安全性较弱
- 保留了 ECDSA 和 RSA
其他标准化
- W3C:EdDSA 被纳入可验证凭证(Verifiable Credentials)标准
- IETF:TLS 1.3 支持 Ed25519 用于密钥交换和证书签名
- NIST SP 800-186:定义了 Curve25519 和 Curve448 用于 ECDH 和签名
总结
EdDSA 代表了数字签名设计的现代范式:
- 安全性:确定性签名消除随机数风险,完备加法公式内置侧信道防护
- 性能:签名速度远超 ECDSA,验签速度可接受
- 简洁性:固定长度签名,无需 DER 编码
- 标准化:RFC 8032 + FIPS 186-5 双重认证
参考来源
- RFC 8032: Edwards-Curve Digital Signature Algorithm (EdDSA) — 原始标准
- FIPS 186-5: Digital Signature Standard (DSS) — NIST 标准
- Bernstein, D.J., et al. "High-speed high-security signatures" (Journal of Cryptographic Engineering, 2012) — 原始论文
- NIST SP 800-186: Recommendations for Discrete Logarithm-Based Cryptography — 曲线参数标准
相关实践
- Schnorr 签名算法原理:数学基础、协议设计与门限签名 — EdDSA 的理论基础
- DSA 数字签名算法原理详解:从 ElGamal 到 FIPS 186-5 的演进与退役 — 传统签名方案对比
- 椭圆曲线密码学(ECC)数学基础与曲线形式 — Edwards 曲线数学基础