Skip to content

算法Algorithm

EdDSA:PureEd25519 的签名与验证

EdDSA · Ed25519 · PureEd25519

从32字节种子展开秘密标量与前缀,产生Ed25519签名,按规范解码和余因子方程验证,并分清严格密钥政策。

形式陈述 ​

固定一种验证变体 ​

EdDSA属于数字签名。本页精确采用RFC8032(2017年1月)的PureEd25519:SHA-512、不带ctx、不作ph预哈希、规范点解码,并选§5.1.7的乘8验证方程。其他Ed25519库可能选择更严格的方程或额外密钥政策;接受集合必须按具体规则比较。

在p=2255−19上使用扭曲Edwards曲线

−x2+y2=1+δx2y2,δ=−121665/121666(modp).

单位元O=(0,1)。标准基点B有素数阶L=2252+27742317777372353535851937790883648493,生成一个循环群;整个曲线群阶为8L,所以曲线上还有不属于该素数阶子群的小阶点。B的编码是字节58后跟31个66。

先理解点的32字节表示 ​

点(x,y)编码为y的32字节小端表示,再把x的最低位写到最后字节最高位。解码先分离该符号位并检查y<p;由

x2=(y2−1)/(δy2+1)(modp)

求平方根,没有根则拒绝,再选择与符号位一致的根。若x=0而符号位为1也拒绝。这样接受的字节表示与点一一对应;解码不是把任意256位整数先模p“修好”。

密钥展开与签名 ​

输入32字节秘密种子seed。令h=SHA512(seed);将前32字节的第一个字节低3位清零,最后字节最高位清零、次高位置1,按小端解释为a,后32字节记prefix。公钥字节A=enc(aB)。这里seed、展开标量a和prefix是不同对象。

对消息字节M,调用密码哈希SHA-512计算

r=LE(SHA512(prefix‖M))modL,R=enc(rB),k=LE(SHA512(R‖A‖M))modL,S=(r+ka)modL.

输出R‖LE32(S),总共64字节。签名时的拼接字段R、A各固定32字节,边界确定;PureEd25519没有内部应用ctx字段。

验证先要求公钥32字节、签名64字节,规范解码A,R为点A′,R′,并要求0≤S<L。用收到的原始R、A字节和消息计算完整挑战整数k,检查

[8S]B=[8]R′+[8k]A′.

方程中模L约简k在乘8后等价;若另选不乘8方程并允许任意曲线点,则不能随意忽略其小阶分量。合法签名满足更强的SB=R′+kA′,所以本页验证也正确。

直觉

签名的线性关系类似“临时承诺加消息挑战乘长期秘密”。prefix使临时标量可由秘密和消息确定,挑战同时绑定R、公钥A和消息,验证者在点群中检查相同关系。标量关系按L计算,点解码按p计算,二者的字节序都与ECDSA常见的大端摘要转换不同。

乘8会消去小阶部分。这让本页验证合同清楚地忽略某些曲线分量,也说明“在曲线上”“在素数阶子群中”“属于某个身份的有效公钥”是三项不同检查。不能因为一次数学验签成功,就自动完成后两项政策。

例子与边界

官方空消息向量 ​

RFC8032 §7.1第一组公开测试seed为9d61b19d…cae7f60,消息为空字节串。其公钥为

d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a

签名为两段32字节:

  • R:e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e06522490155
  • S:5fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b

下载器含完整seed,并同时核对1字节、2字节消息的第二、第三组官方向量。所有这些seed已经公开,不能作为任何真实账户或授权密钥。

允许S为零,不允许把S加L ​

S=0在验证范围内,S=L不在。给合法签名的S加L虽然不改变基点倍数,但必须先被范围检查拒绝。缺失该检查会产生不同字节的等价标量表示。规范y检查与零x的符号检查同样不可由最后群方程代替。

乘8接受集合与密钥准入 ​

取公钥A′=O、签名R′=O,S=0。任意消息都满足本页方程,甚至不乘8也满足。这不攻击“公钥由诚实密钥生成且私钥未知”的安全实验,却说明外部系统若允许注册无效弱密钥,验签不能补救其准入政策。

再取R′=T=(0,−1),它有阶2,仍令A′=O,S=0。乘8方程通过,不乘8方程失败。下载器另提供显式strict_key政策:要求A′≠O且[L]A′=O。这个附加政策拒绝上述公钥;它没有被冒写为RFC的强制步骤,也不顺手拒绝R的单位元,因为合法签名的临时标量可以为零。

推论与应用

PureEd25519、Ed25519ctx、Ed25519ph不能只靠函数名相似就互换。把消息预先SHA-512后送给PureEd25519,是“签那64字节摘要”,并不等于RFC的Ed25519ph。应用若需要角色、版本或用途分离,应按自己的协议无歧义编码实际消息,或选定支持ctx的规范变体;本页下载器只实现PureEd25519。

下载器用扩展坐标(X,Y,Z,T)保存点,满足x=X/Z,y=Y/Z,T/Z=xy,加法使用完整公式,点比较用交叉乘法。每次加法只需常数次模p乘加;二进制标量乘法为O(b)次点运算,b为实际标量位数。SHA-512挑战为512位,种子展开为256位级别,消息读取为O(|M|+1);解码平方根与规范化求逆的模幂成本另列,不把它们算作免费运算。测试实现有秘密相关分支,不适用于生产密钥。

签名执行实验把标准向量、长度错误、S加L、非规范y与小阶例子分开。迁移任务:保留诚实公钥A′=aB,自己取已知r并令R′=rB+T,按新R字节重新计算k,设S=r+kamodL。预测两种验证方程的不同结果,再解释为什么构造这个例子需要知道a,因此不能把它直接称作无私钥伪造攻击。

参考资料
  • Simon Josefsson、Ilari Liusvaara,RFC8032,2017年1月,§§5.1.1–5.1.7、7.1、8.1–8.4
  • RFC Editor,RFC8032已验证勘误:5930修复签名长度拒绝,5968/5519统一0≤S<L,6348澄清点乘记号;本页选定的乘8方程保持§5.1.7定义
关系图谱9 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系