形式陈述
固定一种验证变体
EdDSA属于数字签名理路数字签名Digital signature由私钥签名、公开验证并提供不可伪造性的认证机制。。本页精确采用RFC8032(2017年1月)的PureEd25519:SHA-512、不带ctx、不作ph预哈希、规范点解码,并选§5.1.7的乘8验证方程。其他Ed25519库可能选择更严格的方程或额外密钥政策;接受集合必须按具体规则比较。
在上使用扭曲Edwards曲线
单位元。标准基点有素数阶,生成一个循环群理路循环群Cyclic group能由一个元素的全部整数次幂生成的群。;整个曲线群阶为,所以曲线上还有不属于该素数阶子群的小阶点。的编码是字节58后跟31个66。
先理解点的32字节表示
点编码为的32字节小端表示,再把的最低位写到最后字节最高位。解码先分离该符号位并检查;由
求平方根,没有根则拒绝,再选择与符号位一致的根。若而符号位为1也拒绝。这样接受的字节表示与点一一对应;解码不是把任意256位整数先模“修好”。
密钥展开与签名
输入32字节秘密种子seed。令;将前32字节的第一个字节低3位清零,最后字节最高位清零、次高位置1,按小端解释为,后32字节记prefix。公钥字节。这里seed、展开标量和prefix是不同对象。
对消息字节,调用密码哈希理路密码哈希函数Cryptographic hash function把任意长输入压缩到固定长度并要求原像、第二原像或碰撞难求的函数族。SHA-512计算
输出,总共64字节。签名时的拼接字段R、A各固定32字节,边界确定;PureEd25519没有内部应用ctx字段。
验证先要求公钥32字节、签名64字节,规范解码为点,并要求。用收到的原始R、A字节和消息计算完整挑战整数,检查
方程中模约简在乘8后等价;若另选不乘8方程并允许任意曲线点,则不能随意忽略其小阶分量。合法签名满足更强的,所以本页验证也正确。
直觉
签名的线性关系类似“临时承诺加消息挑战乘长期秘密”。prefix使临时标量可由秘密和消息确定,挑战同时绑定R、公钥A和消息,验证者在点群中检查相同关系。标量关系按计算,点解码按计算,二者的字节序都与ECDSA常见的大端摘要转换不同。
乘8会消去小阶部分。这让本页验证合同清楚地忽略某些曲线分量,也说明“在曲线上”“在素数阶子群中”“属于某个身份的有效公钥”是三项不同检查。不能因为一次数学验签成功,就自动完成后两项政策。
例子与边界
官方空消息向量
RFC8032 §7.1第一组公开测试seed为9d61b19d…cae7f60,消息为空字节串。其公钥为
d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a
签名为两段32字节:
- R:
e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e06522490155
- S:
5fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b
下载器含完整seed,并同时核对1字节、2字节消息的第二、第三组官方向量。所有这些seed已经公开,不能作为任何真实账户或授权密钥。
允许S为零,不允许把S加L
在验证范围内,不在。给合法签名的S加L虽然不改变基点倍数,但必须先被范围检查拒绝。缺失该检查会产生不同字节的等价标量表示。规范y检查与零x的符号检查同样不可由最后群方程代替。
乘8接受集合与密钥准入
取公钥、签名。任意消息都满足本页方程,甚至不乘8也满足。这不攻击“公钥由诚实密钥生成且私钥未知”的安全实验,却说明外部系统若允许注册无效弱密钥,验签不能补救其准入政策。
再取,它有阶2,仍令。乘8方程通过,不乘8方程失败。下载器另提供显式strict_key政策:要求且。这个附加政策拒绝上述公钥;它没有被冒写为RFC的强制步骤,也不顺手拒绝R的单位元,因为合法签名的临时标量可以为零。
推论与应用
PureEd25519、Ed25519ctx、Ed25519ph不能只靠函数名相似就互换。把消息预先SHA-512后送给PureEd25519,是“签那64字节摘要”,并不等于RFC的Ed25519ph。应用若需要角色、版本或用途分离,应按自己的协议无歧义编码实际消息,或选定支持ctx的规范变体;本页下载器只实现PureEd25519。
下载器用扩展坐标保存点,满足,加法使用完整公式,点比较用交叉乘法。每次加法只需常数次模乘加;二进制标量乘法为次点运算,为实际标量位数。SHA-512挑战为512位,种子展开为256位级别,消息读取为;解码平方根与规范化求逆的模幂成本另列,不把它们算作免费运算。测试实现有秘密相关分支,不适用于生产密钥。
签名执行实验把标准向量、长度错误、S加L、非规范y与小阶例子分开。迁移任务:保留诚实公钥,自己取已知并令,按新R字节重新计算,设。预测两种验证方程的不同结果,再解释为什么构造这个例子需要知道,因此不能把它直接称作无私钥伪造攻击。
参考资料
- 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统一,6348澄清点乘记号;本页选定的乘8方程保持§5.1.7定义