Edwards曲线数字签名算法(Edwards-curve Digital Signature Alogorithm, edDSA)由Daniel J. Bernstein等人在2011年提出,它是一种使用基于扭曲爱德华兹曲线的Schnorr签名变体的数字签名方案。
EdDSA的一个特殊之处在于,该方案不要求每次签名都是用全新的随机数,而且该算法是确定性的。
EdDSA不直接生成密钥,而是首先生成一个密钥并用它派生实际的签名密钥和nonce密钥。这个nonce会以确定性的方式生成每个签名所需要的nonce。
计算签名时,EdDSA首先计算nonce密钥(nonce key)与待签名消息的哈希值作为nonce值。算法之后的执行过程类似于Schnorr签名。
- 计算nonce: nonce值为HASH(nonce key message)
- 计算R值: R值为[nonce]G,其中G是群的基点。
- 计算挑战: 挑战值为HASH(commitment publick key message)
- 计算证据: 证据S为 nonce + challenge x signing key
最终签名是(R,S)。
EdDSA密钥生成
EdDSA密钥对包括:
私钥(整数):privKey
公钥(EC点):pubKey = privKey * G
私钥是从一个被称为种子的随机整数生成的(它应该具有类似的比特长度,就像曲线顺序一样)。
公钥pubKey是椭圆曲线上的一个点,通过EC点相乘计算:pubKey=privKey*G(私钥,乘以曲线的生成点G)。公钥被编码为压缩的EC点:y坐标,与x坐标的最低位(奇偶校验)相结合。
EdDSA 签名
EdDSA_sign(msg, privKey) --> { R, s }
- 计算pubKey=privafKey*G
- 确定性地生成一个秘密整数r=hash(hash(privaKey)+msg)mod q
- 通过将r后面的公钥点乘以曲线生成器来计算:r=r*G
- 计算h=哈希(R+pubKey+msg)mod q
- 计算s=(r+h*privKey)mod q
- 返回签名{R,s}
EdDSA验证签名
EdDSA签名验证算法将文本消息msg+签名者的EdDSA公钥pubKey+EdDSA签名{R,s}作为输入,并产生布尔值作为输出。
EdDSA_signature_verify(msg, pubKey, signature { R, s } ) --> valid / invalid
- 计算h=哈希(R+pubKey+msg)mod q
- 计算P1=s*G
- 计算P2=R+h*pubKey
- 返回P1==P2
在验证过程中,点P1计算为:P1=s*G。
在签名过程中,s=(r+h*privKey)mod q。现在将s替换为上式:
P1 = s * G = (r + h * privKey) mod q * G = r * G + h * privKey * G = R + h * pubKey文章来源:https://www.toymoban.com/news/detail-601538.html
以上正是另一点P2。如果这些点P1和P2是相同的EC点,这证明了由私钥计算的点P1与由其对应的公钥创建的点P2匹配。文章来源地址https://www.toymoban.com/news/detail-601538.html
到了这里,关于密码学学习笔记(十七 ):Edwards曲线数字签名算法 - edDSA的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!