(data+私钥)加密=hash1
(data+公钥)加密=hash2
if(hash1==hash2)
data是私钥拥有者发布的数据(验证成功)
else
data被修改或私钥不正确(验证失败)
设P(x,y)在椭圆曲线上,则Q(x,-y)为它的逆元在密码学中,一切的运算都要进行取余,如P为(2,1),则Q为(2,-1),但需要进行取余运算(此处用P值取余,如此时P=3),也就是说,Q实际在取值范围内等同于(2,2).
设P(x1,y1),Q(x2,y2),M(x3,y3),P+Q=M(此处的加法不是单纯的x+x,y+y的坐标相加,而是有固定规则的,规则如下:)
设O为无穷远点,则P+O=P,同理P+(-P)=O,将P进行累加,加到np+p=O,即np与P互为逆元,则n+1称为该椭圆曲线的阶。
在Bitcoin中,用的是y2=x3+7这条椭圆曲线,它的P值和阶都是一个相当大的数值。它中规定了一个G(x,y)(坐标在源代码中写死,均为256位数)。
我们用t代表私钥,用T代表公钥
data:明文
e = hash(data) :加密数据
每一次签名到验证都会生成一个额外的私钥和公钥,用k和K表示。
签名数据:S=k-1(e+tr) 注:r为T的横坐标
首先,我们知道公钥T,也就知道了公钥的横坐标r,签名后的数据S。
w = S-1
u1 = ew
u2 = rw
X = u1G+u2T
if(X的横坐标==r)
验证通过
else:
data被篡改或是签名失败(不是本人的私钥签名,也就是说私钥不正确)
X = u1G+u2T
=u1G+u2tG (因为T=tG)
=(u1+u2t)G (提取公因式G)
=(ew+rwt)G (因为u1 = ew u2 = rw)
=S-1G(e+rt) (提取公因式w,而w=S^-1^)
得X = S-1G(e+rt)
已知S=k-1(e+tr),易得k=S-1(e+tr) (两边同时乘以kS-1)
将k=S-1(e+tr)与X = S-1G(e+rt)联立可得X = kG,而kG =K,得K = kG = X。故验证有效