EdDSAEdwards-Curve Digital Signature Algorithm)是一类基于 Edwards 曲线的 数字签名 算法,典型实例是 Ed25519 和 Ed448。

核心问题

EdDSA 解决的是“如何在椭圆曲线签名里减少随机数错误、简化实现并提升性能”的问题。它和 ECDSA 一样都属于公钥签名:私钥 用来签名,公钥 用来 验签;但签名公式、曲线形式、密钥派生和签名格式不同。

一个重要区别是:EdDSA 默认是确定性签名。每次签名使用的临时标量由私钥材料和消息派生,而不是依赖外部随机数源直接生成。

核心机制

以 Ed25519 风格的 EdDSA 为例,核心对象是:

符号含义
seed32 字节私钥种子,必须保密
aseed 哈希并 clamp 后得到的私有标量
B标准曲线的公开基点
A公钥点,A = aB
M被签名消息
R, S签名的两部分

简化签名流程是:

h = H(seed)
a = clamp(h 的前半部分)
prefix = h 的后半部分
A = aB
 
r = H(prefix || M) mod L
R = rB
k = H(R || A || M) mod L
S = (r + k*a) mod L
 
signature = R || S

这里 B 是公开基点,aBrB 都是 椭圆曲线标量乘法L 是大素数阶子群的阶。clamp 会清理和设置私有标量的若干比特,让它落在算法需要的形态中。

验签时,验证方使用公钥 A、消息 M 和签名 R || S 检查类似下面的群等式:

S*B = R + k*A

其中 k = H(R || A || M) mod L。这个等式成立,说明签名中的 SR 与公钥 A、消息 M 相互匹配。

工程用途

  • SSH key:现代 OpenSSH 常见 ssh-ed25519
  • 软件签名和包签名:很多新系统使用 Ed25519 作为紧凑快速的签名方案。
  • 协议身份认证:适合需要短公钥、短签名和较好实现安全性的场景。
  • DNSSEC 和证书生态:部分协议和标准支持 EdDSA 标识符。

观察点包括具体实例名称、签名变体、私钥格式、公钥编码、是否 prehash、是否带 context,以及库是否严格检查点编码和小阶点。

边界与常见坑

  • EdDSA 不是 ECDSA:签名公式、密钥格式和签名格式都不兼容。
  • Ed25519 不是 X25519:前者用于签名,后者用于密钥交换;二者曲线相关但用途和编码不同。
  • 默认 Ed25519 不先对消息外部哈希:RFC 8032 还定义 Ed25519ph 和 Ed25519ctx,变体之间不能随意混用。
  • 签名通常固定 64 字节:Ed25519 签名是 R || S,不是 ECDSA 的 DER SEQUENCE { r, s }
  • 确定性不等于私钥可公开:临时量由私钥派生,私钥或 seed 泄露仍然会导致完全失效。

相关术语