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的所有组合。
- 使用bits2int变换和额外的模块化约简将H(m)转换为整数模q:
1 | h = bits2int(H(m)) mod q |
正如在bit2octets的描述中所指出的那样,额外的模块化缩减只不过是有条件的减法。
-
生成称为k的取模q的随机值。 该值不为0。因此,它位于[1,q-1]范围内。在ECDSA中,应通过随机选择来选择k,该选择应以均匀的概率从q-1个可能的值中选择一个值。
-
根据k和关键参数计算出值r (modulo q)。计算出点kG;其X坐标(定义了E的字段的成员)被转换为整数,该整数以q为模减小,从而得出r。如果r变为零,则应选择一个新的k并再次计算r(这是完全不可能的情况)。
-
值s (modulo q)的计算如下:
1 | s =(h + x * r)/ k mod q |
(r, s)就是签名。ECDSA标准本身并未涵盖如何对签名进行编码; 常见的方法是使用DER编码的ASN.1结构(两个INTEGER的SEQUENCE,分别用于r和s),或者作为两个32bytes拼接为一个64bytes。
签名验证过程如下:
-
验证 r , s 都处于 [1, n-1] 范围内的整型数,否则验证失败
-
e为消息的hash值
-
计算z
-
计算参数 w :
-
计算两个参数 u1, u2 :
-
(x1, y1),如果该点不是同一个曲线上的点,验证失败
-
如果存在下面的恒等式,则验证通过,否则验证失败
TODO
生成不变的sign