现在有一个场景:
Alice想要用私钥签名一个数据,Bob想要使用Alice的公钥验证这个签名;只有Alice能够进行计算签名然后得到签名,每个人都能验证签名值。
首先Alice和Bob拥有相同的椭圆曲线参数,算法被签名称之为ECDSA,是DSA算法的一个变体。
ECDSA签名算法的输入是数据的哈希值,而不是数据的本身,至于哈希算法选用哪一个就取决于自己了。为了使得ECDSA的输入值的比特数和子群的阶n的比特数一样,哈希值可能会被截断。我们把ECDSA输入称之为Z。
算法工作流程如下:
(1)取一个范围在[1, n - 1]的随机数k
(2)计算点P=kG
(3)计算r = xp mod n
(4)如果 r == 0,执行第一步
(5)计算s = k^-1 (z + r*da) mod n (da是Alice的公钥,k^-1 是 k 对n的逆元)
(6)如果s==0,执行第一步
(7)二元组(r, s)就是签名值
(一般情况,最后的结果r和s是用asn1格式封装的,至少的TLS签名和数字证书签名中是这样的,不是简单的r+s这样字节直接拼接)
上图中,Alice使用私钥da对z进行签名,生成二元组(r, s)。
Bob使用A