EdDSA 数字签名算法原理详解:从 Edwards 曲线到 FIPS 186-5 标准化

算法原理 · 2026-07-10

概述

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
余因子 8 的含义:Edwards25519 上的点总数约为 $8\ell$,其中 $\ell$ 是一个大素数。EdDSA 的私钥和公钥都定义在素数阶子群中(阶为 $\ell$),余因子 8 通过 clamping 操作处理。

私钥 Clamping

Ed25519 的私钥处理包含一个关键步骤——Clamping,它确保标量乘法在正确的子群中进行:

给定 32 字节私钥种子 $k$,计算标量 $s$:

  • 计算 $h = \text{SHA-512}(k)$(64 字节)
  • 取 $h[0:32]$ 作为低位部分,进行 clamping:
- 清除 $h[0]$ 的低 3 位(确保是 8 的倍数) - 设置 $h[31]$ 的最高位为 0(防止超过 $\ell$) - 设置 $h[31]$ 的次高位为 1(确保标量足够大)
  • 将 $h[0:32]$ 解释为小端序整数 $s$,作为私钥标量
Clamping 的作用:
  • 低 3 位清零 → 标量是 8 的倍数 → 标量乘法结果在素数阶子群中
  • 次高位设为 1 → 标量足够大 → 抵抗小标量攻击

签名与验签算法

密钥生成

CODE
私钥: 随机 32 字节 k
h = SHA-512(k)                    // 64 字节
s = clamp(h[0:32])                // 私钥标量(小端序)
A = [s]B                          // 公钥(Edwards 曲线上的点)

公钥 $A$ 是基点 $B$ 的 $s$ 倍标量乘法。

签名算法

EdDSA 签名是确定性的——相同的消息和私钥总是产生相同的签名。

CODE
输入: 私钥种子 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)$ 将签名与公钥和消息绑定,防止签名伪造。

验签算法

CODE
输入: 公钥 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 位安全级别:

参数Ed25519Ed448
素数 $p$$2^{255} - 19$$2^{448} - 2^{224} - 1$
安全级别~128 位~224 位
余因子84
哈希函数SHA-512SHAKE256(114 字节输出)
签名长度64 字节114 字节
Ed448 使用 SHAKE256(SHA-3 的可变输出变体)替代 SHA-512,以获得足够的哈希输出长度。

安全性分析

EUF-CMA 安全

EdDSA 在随机预言机模型(Random Oracle Model)下被证明具有存在不可伪造性(EUF-CMA)——即攻击者无法在适应性选择消息攻击下伪造有效签名。

安全性依赖于:

  • ECDLP 困难性:在 Edwards 曲线上求解离散对数在计算上不可行
  • 哈希函数的抗碰撞性:SHA-512/SHAKE256 的抗碰撞和前像攻击能力
  • 确定性 nonce:消除了随机数重用风险

侧信道防护

EdDSA 的侧信道防护是内置的,而非外加的:

  • 完备加法公式:所有点加法使用同一公式,无分支 → 抵抗时序攻击
  • 确定性签名:无随机数生成器 → 抵抗 RNG 故障攻击
  • 固定时间标量乘法:使用 Montgomery ladder 或双标量乘法技术,运算时间与标量值无关
相比之下,ECDSA 需要额外的恒定时间实现来抵抗时序攻击,且随机数生成器的任何缺陷都可能导致私钥泄露。

与 ECDSA 的对比

维度ECDSAEdDSA
签名随机性需要随机 nonce确定性(无需随机数)
签名速度较慢(需模逆)较快(无模逆)
验签速度较快(单标量乘法)稍慢(双标量乘法)
侧信道防护需要额外实现内置(完备加法公式)
签名长度64-72 字节(DER 编码)64 字节(固定)
公钥恢复支持不支持
标准化FIPS 186-5, ANSI X9.62RFC 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

工程实践要点

密钥生成

签名验证注意事项

  • 子群检查:验签时必须验证 $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
FIPS 186-5 的批准标志着 EdDSA 从"互联网标准"升级为"政府标准",为其在金融、医疗、政府系统中的合规使用铺平了道路。

其他标准化

  • W3C:EdDSA 被纳入可验证凭证(Verifiable Credentials)标准
  • IETF:TLS 1.3 支持 Ed25519 用于密钥交换和证书签名
  • NIST SP 800-186:定义了 Curve25519 和 Curve448 用于 ECDH 和签名

总结

EdDSA 代表了数字签名设计的现代范式:

  • 安全性:确定性签名消除随机数风险,完备加法公式内置侧信道防护
  • 性能:签名速度远超 ECDSA,验签速度可接受
  • 简洁性:固定长度签名,无需 DER 编码
  • 标准化:RFC 8032 + FIPS 186-5 双重认证
与 ECDSA 的对比揭示了密码学设计的演进方向:从"需要小心使用的强大工具"到"默认安全的用户友好方案"。EdDSA 的确定性、内置侧信道防护、以及更简单的实现要求,使其成为新系统的首选签名方案。

参考来源

相关实践