基于椭圆曲线的签名验证

一.非对称加密

定义: 对称加密算法在加密和解密时使用的是同一个祕钥;而非对称加密算法需要两个密钥来进行加密和解密,这两个祕钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。

待验证数据:data

(data+私钥)加密=hash1
(data+公钥)加密=hash2

if(hash1==hash2)
    data是私钥拥有者发布的数据(验证成功)
else
    data被修改或私钥不正确(验证失败)

二.椭圆曲线

标准式: y2+axy+by=x3+cx2+dx+e

简化式:y2=x3+ax+b

P:x的定义域,y的值域,只能取0或正整数,如P=23,x,y=[0,22]

三.点与点的加法运算

  设P(x,y)在椭圆曲线上,则Q(x,-y)为它的逆元在密码学中,一切的运算都要进行取余,如P为(2,1),则Q为(2,-1),但需要进行取余运算(此处用P值取余,如此时P=3),也就是说,Q实际在取值范围内等同于(2,2).

注:以下所有的运算均需要用P取余(非常重要)

  设P(x1,y1),Q(x2,y2),M(x3,y3),P+Q=M(此处的加法不是单纯的x+x,y+y的座标相加,而是有固定规则的,规则如下:)

当P!=Q:

λ = y2-y1/x2-x1

当P==Q:

λ = 3x12+a/2y1(著名的电子数据货币bitcoin的验证签名就是用的这种方式)

x3 = λ2-x1-x2

y3 = λ(x1-x3)-y1

  设O为无穷远点,则P+O=P,同理P+(-P)=O,将P进行累加,加到np+p=O,即np与P互为逆元,则n+1称为该椭圆曲线的阶。

四.私钥和公钥的生成

私钥:随机生成的256位的字符串

公钥:利用私钥生成

  在Bitcoin中,用的是y2=x3+7这条椭圆曲线,它的P值和阶都是一个相当大的数值。它中规定了一个G(x,y)(座标在源代码中写死,均为256位数)。

公钥 = 私钥*G,也就是说,将G点累加私钥数值次过后,将得到公钥,乍看之下不可思议,累加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)
    验证通过
elsedata被篡改或是签名失败(不是本人的私钥签名,也就是说私钥不正确)

七.数学证明验证有效

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。故验证有效

点赞