EdDSA(Edwards-Curve Digital Signature Algorithm)是一类基于 Edwards 曲线的 数字签名 算法,典型实例是 Ed25519 和 Ed448。
核心问题
EdDSA 解决的是“如何在椭圆曲线签名里减少随机数错误、简化实现并提升性能”的问题。它和 ECDSA 一样都属于公钥签名:私钥 用来签名,公钥 用来 验签;但签名公式、曲线形式、密钥派生和签名格式不同。
一个重要区别是:EdDSA 默认是确定性签名。每次签名使用的临时标量由私钥材料和消息派生,而不是依赖外部随机数源直接生成。
核心机制
以 Ed25519 风格的 EdDSA 为例,核心对象是:
| 符号 | 含义 |
|---|---|
seed | 32 字节私钥种子,必须保密 |
a | 从 seed 哈希并 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 是公开基点,aB 和 rB 都是 椭圆曲线标量乘法;L 是大素数阶子群的阶。clamp 会清理和设置私有标量的若干比特,让它落在算法需要的形态中。
验签时,验证方使用公钥 A、消息 M 和签名 R || S 检查类似下面的群等式:
S*B = R + k*A其中 k = H(R || A || M) mod L。这个等式成立,说明签名中的 S 和 R 与公钥 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 的 DERSEQUENCE { r, s }。 - 确定性不等于私钥可公开:临时量由私钥派生,私钥或 seed 泄露仍然会导致完全失效。