密码学学习笔记(十七 ):Edwards曲线数字签名算法 - edDSA

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 \left | \right | message)
  • 计算R值: R值为[nonce]G,其中G是群的基点。
  • 计算挑战: 挑战值为HASH(commitment \left | \right | publick key \left | \right | message)
  • 计算证据: 证据S为 nonce + challenge x signing key

最终签名是(R,S)。

EdDSA的密钥生成算法生成一个密钥,然后用它派生另外两个密钥。算法生成的第一个密钥是实际的签名密钥,该签名密钥可用于生成公钥;算法生成的另一个密钥是nonce密钥,用于在签名时确定性地生成nonce。EdDSA签名与Schnorr签名类似,不同之处在于(1)EdDSA用nonce密钥和消息确定性地生成nonce,以及(2)签名者的公钥包含在挑战中

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

以上正是另一点P2。如果这些点P1和P2是相同的EC点,这证明了由私钥计算的点P1与由其对应的公钥创建的点P2匹配。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值