ECDSA签名及验证

ECDSA私钥是取q为模后得到的整数x。相关标准规定x不得为0。 因此,x是在[1,q-1]范围内的整数。qlen为q的二进制长度。

签名的生成使用了密码学哈希函数H和输入的消息m。消息首先由H处理,产生值H(m)即消息m的hash,它是长度为hlen的二进制序列。通常,选择H使其输出长度hlen大致等于qlen,因为签名方案的总体安全性取决于hlen和qlen之间的最小值;但是,相关标准支持hlen和qlen的所有组合。

  1. 使用bits2int变换和额外的模块化约简将H(m)转换为整数模q:
1
h = bits2int(H(m)) mod q

正如在bit2octets的描述中所指出的那样,额外的模块化缩减只不过是有条件的减法。

  1. 生成称为k的取模q的随机值。 该值不为0。因此,它位于[1,q-1]范围内。在ECDSA中,应通过随机选择来选择k,该选择应以均匀的概率从q-1个可能的值中选择一个值。

  2. 根据k和关键参数计算出值r (modulo q)。计算出点kG;其X坐标(定义了E的字段的成员)被转换为整数,该整数以q为模减小,从而得出r。如果r变为零,则应选择一个新的k并再次计算r(这是完全不可能的情况)。

  3. 值s (modulo q)的计算如下:

1
s =(h + x * r)/ k mod q     

(r, s)就是签名。ECDSA标准本身并未涵盖如何对签名进行编码; 常见的方法是使用DER编码的ASN.1结构(两个INTEGER的SEQUENCE,分别用于r和s),或者作为两个32bytes拼接为一个64bytes。

签名验证过程如下:

  1. 验证 r , s 都处于 [1, n-1] 范围内的整型数,否则验证失败

  2. e为消息的hash值

  3. 计算z

  4. 计算参数 w :

    w=s1 mod nw=s^{−1}\ mod\ n

  5. 计算两个参数 u1, u2 :

    u1=zw mod n, u2=rw mod nu_1=zw\ mod\ n,\ u_2=rw\ mod\ n

  6. (x1, y1),如果该点不是同一个曲线上的点,验证失败

    (x1,y1)=u1×G+u2×QA(x_{1}, y_{1}) = u_{1} \times G + u_{2} \times Q_{A}

  7. 如果存在下面的恒等式,则验证通过,否则验证失败

    rx1 mod nr≡x_1\ mod\ n

TODO

生成不变的sign