密码学学习笔记(十七 ):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)。

密码学学习笔记(十七 ):Edwards曲线数字签名算法 - edDSA_第1张图片 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匹配。

你可能感兴趣的:(密码学,密码学,学习,笔记)