1. 说明
Alice和Bob在通信的过程中,为了验证消息的来源,既消息确实是Alice发出来的。需要由Alice对消息使用自己的私钥生成一个签名hash,然后Bob用Alice的公钥进行验证,判断hash是否一样,从而知道签名是否正确。
2. 步骤
假设:
- 基点:G
- 私钥:k
- 公钥:K =k *G
- Message:M
step1. Alice 数据传送前的操作:生成公私钥对
step2. Alice
- 选择随机数r
- 计算点r*G,得到(x, y)
- 根据消息求哈希h
- 根据随机数r、消息M的哈希h、私钥k,计算s = (h + kx)/r.
- 将消息M、签名{rG, s}、公钥K发给Bob
step3. Bob:收到消息M、以及签名{rG=(x,y), s}
- 根据消息求哈希h
- 使用发送方公钥K计算:hG/s + xK/s,并与rG比较,如相等即验签成功
hG/s + xK/s = hG/s + x(kG)/s = (h+xk)G/s = r(h+xk)G / (h+kx) = rG
注:
- r值
在选择随机数r的时候,真正的算法需要做一个判断,计算 r 值是否为0, 如果r == 0, 需要重新随机:r = x mod n - n值
如果说椭圆曲线方程可用(CURVE, G, n)表示,其中CURVE表示椭圆曲线点域和几何方程;G是所有点倍积运算的基点;n是该椭圆曲线的可倍积阶数(multiplicative order),作为一个很大的质数,n的几何意义在于,nG 是阿贝尔群的单位元。 - h值
实际上需要对h值作一个转换,既是对h的二进制形式下最左边(即最高位)L_n个bits,而L_n是上述椭圆曲线参数中的可倍积阶数n的二进制长度。注意z 可能大于n,但长度绝对不会比 n 更长
【参考】