按这张图,EdDSA(这里基本就是 Ed25519)的签名和验证流程可以分成两大块来看:上半部分是 Signing process,下半部分是 Verifying process。
一、参与的元素与符号
左侧图例先说明了几个符号含义:
q:私钥(种子,通常是 32 字节随机数)。
m:要签名的消息(这里写的是 transaction’s metadata)。
Q:公钥,是曲线上的一点。
粉色箭头:Ed25519 特有的bit pruning / bit clamping操作(裁剪 / 钳位一些比特)。
灰色箭头:廉价运算(基本是哈希、拼接等)。
蓝色箭头:标量乘点(椭圆曲线最贵的运算)。
二、从私钥到公钥:q → a → Q
先不管消息,只看左边这一竖条:
对私钥q做一次哈希:
得到 64 字节的结果,分成left和right两半(图里 q 箭头指向一个 “left / right” 的框)。对left半部分做粉色的bit pruning(比特裁剪/钳位):
得到一个标量图里写成private scalar = a。
用这个标量a去乘基点 G:
Q=aG蓝色箭头 aG 指向 Q,这就是公钥 Q(曲线上的点)。
小结:
q:只是一个随机种子。
a:真正参与运算的“私有标量”,由 q 经过 hash+bit pruning 得来。
Q:公钥点,由 aG 得到。
三、签名流程(Signing process)
签名阶段输入是:q(私钥)和m(消息),输出是签名 (R, s)。
图上从 q、m 出发往右上走:
1. 计算一次性随机数 r
利用前面哈希得到的right半部分(图中 q → left/right,再从 right 指到 r)。
把right和消息m拼在一起做哈希(图上 m 也指向 r):
其中 L是子群的阶。
r 是一个“伪随机的 nonce”,完全由私钥和消息决定,不需要外部随机数。
2. 计算点 R = rG
用 r 乘基点:
R=rG蓝色箭头 rG 指向 R。
这一步得到曲线点 R,是签名的一部分。
3. 计算挑战值 e
把 R、消息 m、公钥 Q 拼在一起哈希(图中 R、m、Q 都指向 e):
这个 e 就是验证时要用的“挑战”。
4. 计算标量 s
用 r、e、a(私有标量)组合:
图中 s 的输入来自 r 与 e 和(隐含的)a。
<