EdDSA是一种基于 Twisted Edwards曲线 的 数字签名算法。
Twisted Edwards曲线是椭圆曲线的一种, 对应公式:
ax2+y2=1+dx2y2
EdDSA的具体实现有Ed25519 (基于Curve25519的Edwards形式), Ed448...
EdDSA不像ECDSA需要随机数nonce, 签名流程中使用了 sha512
Ed25519签名和验签流程:
假设 A和B两个用户, A 签名信息 B验证信息
通信双方A和B, 已知信息有:
- Ed25519椭圆曲线
−x2+y2≡1−121666121665x2y2mod(2255−19)
- 基点 G
- G 的阶 n
2252+27742317777372353535851937790883648493
- 要签名的消息 m
1. A 生成自己的公钥私钥, 随机生成 KA,然后
h=Hash512(KA)
其中 h 是 64 字节: 前32字节(scalar)用于计算公钥, 后32字节(prefix)用于后续生成签名使用 ... 经过计算得到A的公钥 HA 2. 计算随机数“r”,
r=littleEndian(Hash512(prefix∣∣m))modn
, 哈希后转小端字节序再模n
prefix为私钥hash后32位, m签名的消息, n 为G 的阶 3. 计算“R”坐标,
R=r∗G
,
G为基点, r为第2步计算的结果 4. 计算“k”
k=littleEndian(Hash512(R∣∣HA∣∣m))modn
, 哈希后转小端字节序再模n
R为第3步计算的结果, HA为A的公钥, m签名的消息, n 为G 的阶 5. 计算 "S",
S=(r+k∗s)modn
r为第2步计算的结果, k为第4步的结果, s为 scalar私钥hash后的前32字节, n 为G 的阶 6. 生成最后的signature = R + littleEndian(S)
1. 解析签名得到 R和S,
R = sign的前32个字节
s = littleEndian(sign的后32个字节), 此时S是小端字节序转回 正常序
2. 计算SB
SB=G∗s
(s第1步得到, G为基点) 3. 计算k
k=hash512(R∣∣HA∣∣m)
其中R为第1步中前32个字节, HA为 A的公钥, m签名的消息 4. 计算RKA
RKA=R+HA∗k
其中R为第1步中前32个字节, HA为 A的公钥, k为第3步的结果 5. 验证签名 RKA === SB 相等则验签成功