Ed25519EdDSA 的一个具体签名方案,基于 Edwards25519 曲线和 SHA-512,常见公钥长度为 32 字节、签名长度为 64 字节。

核心问题

Ed25519 解决的是“用更简单、更快、更不依赖外部随机数的方式做椭圆曲线数字签名”的问题。它常被拿来替代 RSA 或 ECDSA 用于 SSH、软件签名和协议认证。

它不是单纯的“另一条曲线名”。Ed25519 同时规定了曲线、基点、哈希函数、私钥种子展开、标量 clamp、签名生成、验签规则和编码格式。

核心机制

Ed25519 的底层有限域是:

p = 2^255 - 19

它使用 Edwards25519 曲线和公开基点 B。实际密钥关系可以简化为:

seed:32 字节私钥种子
a = clamp(SHA-512(seed) 的前 32 字节)
A = aB

其中 A公钥aB椭圆曲线标量乘法。注意这里的私钥文件格式在不同库里可能保存的是 seed、seed+public key,或封装后的私钥对象;不要把这些字节布局和数学私有标量 a 混为一谈。

签名可以简化表示为:

prefix = SHA-512(seed) 的后 32 字节
r = SHA-512(prefix || M) mod L
R = rB
k = SHA-512(R || A || M) mod L
S = (r + k*a) mod L
 
signature = R || S
符号含义
M被签名消息
L大素数阶子群的阶
R临时公钥点,通常编码为 32 字节
S标量,通常编码为 32 字节
`R

验签时,验证方用公钥 A 和消息 M 重新计算 k,然后检查群等式是否成立:

S*B = R + k*A

这和 ECDSA 的 (r, s) 公式不同。Ed25519 的签名虽然也有两部分,但它们是 RS,不是 ECDSA 的 rs

工程用途

  • SSHssh-ed25519 是常见现代 SSH 密钥类型。
  • 软件包和更新签名:固定长度签名和快速验签适合发布物校验。
  • 协议身份认证:适合短公钥、短签名和较低实现复杂度的认证场景。
  • 嵌入式验证:设备可以内置 Ed25519 公钥和验签算法,验证授权文件或固件签名。

观察点包括 key type 是否真的是 Ed25519、签名是否 64 字节、库是否支持纯 Ed25519/Ed25519ph/Ed25519ctx、私钥文件到底存的是 seed 还是扩展格式。

边界与常见坑

  • Ed25519 不是 ECDSA P-256:算法、曲线、签名格式、密钥格式都不同。
  • Ed25519 不是 secp256k1:区块链系统常用 secp256k1,而 SSH 和现代协议常见 Ed25519。
  • Ed25519 不是 X25519:Ed25519 用于签名,X25519 用于密钥交换,二者不能直接当作同一种密钥使用。
  • 不要预先哈希后再当普通消息签名,除非协议规定:Ed25519、Ed25519ph、Ed25519ctx 是不同变体。
  • 签名格式通常不是 DER:Ed25519 签名是固定 R || S,不要按 ECDSA 的 DER r/s 解析。
  • 公钥仍是信任锚:验签通过只说明签名匹配这把公钥,仍要判断这把公钥是否属于预期主体。

相关术语