深入区块链以太坊源码之椭圆曲线算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Grit_ICPC/article/details/83961312

椭圆曲线加密算法Elliptic Curve CryptoSystem
安全性基础:椭圆曲线群上的离散对数问题。目前,最好解决算法仍是指数时间。

一、椭圆曲线群是由两部分组成:
第一部分是M。区域F中有两个数a,b
M = y^2  = x^3 + ax + b  其中x,y属于F*F
第二部分为O点(无穷远点)
(椭圆曲线群)E = O U M

知道了椭圆曲线群的定义之后,根据参数的不同其在坐标轴上的图像必定是不同的,有的
关于x轴是对称的,有的不对称。为了方便研究可以取关于x轴堆成的椭圆曲线:
y^2 = x^3 - x。所表示的图像就是左边是一个椭圆曲线,右边是一个类似小于号的半开口形状

二、
椭圆曲线上的加法(几何的表示方法)
根据曲线上两点的选择可以分为以下三种情况:
1. 当选择的两个不相同点(这里选择的两点一般为类似椭圆上的两点),
且两点的连线不是和Y轴平行。那么延长线段必定和曲线上另一个点相交为P,
这个相交的点P做与Y轴平行的线交于椭圆上另一点P',p'这个点就是两点相加的结果

2.如果选择的点相同,则作此点在椭圆上的切线,又会交于一点(剩余步骤同1.)

3.若两点相连的延长线和Y轴平行,那么两点的加和就是无穷远点O

椭圆曲线上的加法(数学上的描述方法)
(1)P + O = O + P = P (P属于E,O为无穷远点,这里的无穷远点类似于零)
(2)P=(x1,y1) ,Q = (x2,y2) 属于E

            
         1.O 若 x1 = x2 且 y1 = -y2
P + Q = 
         2.(x3,y3) 其他

其中
            / x3 = t^2-x1-x2              / 1.(y2-y1)/(x2-x1) 若P!=Q (点加运算)
  点R=                               且 t = 
            \ y3 = t(x1-x3)-y1           \    2.(3*x1^2+a) / (2y1) 若P = Q (倍乘运算)

因此(x3,y3)有三种结果。
我们试着证明为什么会有这三种结果呢?

A .讨论并证明t的取值
P=(x1,y1) ,Q = (x2,y2) 属于E
    1.当P != Q时,两点斜率为t = (y2-y1)/(x2-x1) 
    2.当P = Q,在P(Q)点的导数就是t = dy/dx
对等式y^2 = x^3 + ax + b两边关于x求导得到:
2y*(dy/dx) = 3x^2 + a
以及t = (dy/dx) = (3*x1^2+a) / (2y1)

B.证明直线y = tx + c与椭圆曲线y^2 = x^3 + ax + b的第三个交点
所以可以联立上面两个方程得到一个关于t和x的方程得:
x^3-t^2*x+(a+2tc)*x+b-c^2 = 0
设R'=(x3,-y3)是pq之外的第三个点。可得:x1+x2+x3 = t^2
这里可以求得x3的值,再带入直线方程可得到y3的值y3取负得到最终的值


练习:
    设p=23,F=Z mod p 椭圆方程y^2 = x^3+x+4 P(4,7) ,Q(13,11)

    点加运算:P+Q = (15,6)   倍乘运算:2P(10,18)

我们可以看看点加运算的x3,y3是怎么得到的:
根据斜率公式我们可以简单的得到t = 4/9,
同时过两点的直线方程为:y = (4/9)x-2
根据公式x1+x2+x3 = t^2
x3 = (4/9)^2 - 4-13 = ? (mod 23)
但真正在椭圆曲线上求解t(这里是4/9)时会使用逆元而并非直接运算,
因为现实情况中分子分母可能会非常大不能直接运算,而往往这种情况下
都允许取模来控制结果的范围。但除法不能取模,而乘法可以取模。那么
逆元就派上用场了。

若对于数字A,C 存在X,使A * X = 1 (mod C) ,那么称X为 A 对C的乘法逆元。

回归上述问题x3 = (4/9)^2 - 4-13 = ? (mod 23)如何用逆元求解问题?
根据逆元形式我们整理上式 16/81  mod 23 = (17+?) 
对于(81,23) X * 81 = 1 mod 23 得到X = 2
那么(16/81) * (2*81) = (17+?) mod 23
结果得到?= 15即为x3的值  

    求解一个整数K,使得在椭圆曲线E上的两个点a,b
满足K*a = b,这就称之为椭圆曲线群E上的离散对数问题,但是
这个问题和Np问题一样是数学困难问题


三、椭圆曲线的数字签名
数字签名应该满足的条件:
    1、签名与文件是不可分割的整体。
    2、签名者不能否认自己的签名。
    3、接受者能验证签名,任何人都不能伪造签名。
    4、双方发生争执,有可信第三方解决问题。

数字签名方案的分类:
    1.利用特殊的公钥加密算法实现。并且所有的公钥加密算法都能实现数字签名。
只有满足D(E(x)) = E(D(x)) = x(E为加密,D为脱密)的公钥密码算法才能实现数字签名。
    2.利用专门设计的数字签名算法。

基于公钥算法设计的数字签名
用户A对文件m签名过程:
    (1)利用签名密钥Kd对m进行脱密变换D,得到sign(m) = D(m)
    (2)签名者将文件m和签名sign(m)一起公布

用户B对签名验证过程:
    利用用户A的签名识别秘钥Ke对签名sign(m)执行加密变换E,即E(sign(m))
    如果结果和m相同则是用户A对m的签名,否则不是。(因为E(D()) = D(E()))

ECDSA签名的过程是:

假设Alice要给Bob发一个经过数字签名的消息,他们首先需要定义一组共同接受的椭圆曲线加密用参数,
简单的,这组参数可表示为(CURVE, G, n)其中,CURVE表示椭圆曲线点域和几何方程;G是所有点倍积运算的基点;
n是该椭圆曲线的可倍积阶数(multiplicative order),作为一个很大的质数,n的几何意义在于,nG = 0,
即点倍积nG的结果不存在,而对于小于n的任何一个正整数 m = [1,n-1],
点倍积mG都可以得到一个合理的处于该椭圆曲线上的点。

其次,Alice要创建一对钥,即一个私钥和一个公钥。
私钥来自于[1, n-1]范围内一个随机数:dA = rand(1,n-1)
公钥如下,它来自私钥和基点的椭圆曲线点倍积:
QA = dA * G
假设Alice想要对消息m作数字签名,有以下步骤:
    1.计算 e = HASH(m),HASH是一个哈希加密函数,比如SHA-2,或SHA-3。
    2.计算 z,来自e的二进制形式下最左边(即最高位)L_n个bits,
而L_n是上述椭圆曲线参数中的可倍积阶数n的二进制长度。注意z 可能大于n,但长度绝对不会比 n 更长。
    3.从 [1, n-1] 内,随机选择一个符合加密学随机安全性的整数k。
    4.计算一个椭圆曲线上点:
(x1,y1) = k * G
    5.以下式计算 r 值, 如果r == 0, 则返回步骤3重新计算。
r = x1 % n
    6.以下式计算 s 值,如果 s == 0,则返回步骤3重新计算。
s = k^(-1) * (z + r*dA) % n
生成的数字签名就是 (r, s)
特别需要注意的是步骤3中 k 的选择,它不仅要满足加密学的随机安全性要求,
要像私钥一样保护起来,更重要的是,在每次生成一个新的数字签名时,这个 k 必须每次都要更新

验证ECDSA签名的过程:
    收到数字签名文件外,还会有一份公钥。所以Bob的验证分两部分,首先验证公钥,
然后验证签名文件(r, s)。
一、公钥验证
    1.通过公钥的坐标QA验证它必须是处于该椭圆曲线上的点。
    2.曲线的可倍积阶数 n 与公钥的点倍积不存在。n×QA=O
二、签名文件的验证
    1、验证r和s均是处于[1, n-1]范围内的整型数;否则验证失败
    2、计算e=HASH(n),HAHS()即签名生成过程步骤1中使用的哈希函数。
    3、计算z,来自e的最左边L_n个bits。
    4、计算参数w:
    w=s^(-1) mod n
    5、计算两个参数u1和u2:
    u1=zw mod n ,u2=rw mod n

    6、计算(x1, y1),如果(x1, y1)不是一个椭圆曲线上的点,则验证失败:
    (x1, y1) =u1×G + u2×QA

    7、如果以下恒等式不成立,则验证失败:
    r≡(x1mod n)

    以上就是椭圆曲线数字签名算法(ECDSA)的生成和验证的完整过程。

猜你喜欢

转载自blog.csdn.net/Grit_ICPC/article/details/83961312