一、前言
椭圆曲线加密算法出现的主要原因,并不是RSA加密算法被彻底攻破,大整数分解仍然是一个数学难题。
只是RSA加密过程中的指数运算效率太低。椭圆曲线的出现改变了这一现象,而且椭圆曲线运用的离散对数同样是一个数学难题,可以作为加密算法的数学基础。
比较重要的是除了私钥k,其他无论是 椭圆曲线方程中的a、b,还是初始点P、公钥Q、随机数r都是对外界公开的。
这是密码学期末考试的第9、10项。
二、椭圆曲线构造过程(不考)
1、要有一个椭圆曲线方程:y^2 = x^3+ax+b
条件:(4 * a^3 != 27 * b^2)
2、椭圆曲线要有一个初始点P(x0,y0)
3、选定一个大整数 k 作为私钥
4、计算Q = kP, Q作为公钥
5、加密 解密
加密:选择一个随机数r 已知明文M,生成密文C = (rP,M+rQ)
解密:已知C(rP , M+rQ) 求明文M
因为Q = kP 所以 C(rP,M+rkP) 所以我们只需要把 纵坐标y 减去rkP就可以得到明文M
M = M+rQ - rkP
三、椭圆曲线的加法运算
例1:
我们先求点2P = P+P
现在已知一个椭圆曲线:y^2=x^3+ax+b
我们现在已知了一个点P (x1,y1) 那么2P = P + P等于什么呢?
过P点引一条曲线的切线
此时有一个交点P' 我们还需要进一步操作
找到P'与x轴的对称点P2
现在的点P2 就是我们要找的2P = P + P
现在知道这个点 是怎么来的了
那要怎么找到这个点的具体坐标呢?
现在要引入一个公式
求点P(x1,y1),点Q(x2,y2)的相加后的 点P+Q(x3,y3)
① P = Q时 λ = (3 * (x1)^2 + a) / 2*y1
② P ≠ Q时 λ = (y2 - y1)/(x2 - x1)
x3 = λ^2 - x1 - x2
y3 = λ*(x1 - x3) - y1
这样就能求出x3和y3了
我只做了P = Q时的图
其实P≠Q时
就是连接P、Q画直线l
找直线与椭圆的交点
交点就是(P+Q)'
还要找到该交点关于x轴的对称点
对称点就是(P+Q)
如果这个点如果是一个小数,那么这个点就会非常的难以计算
于是椭圆曲线就引入了一个有限域GF(p)
也就是每次x3 y3的计算中都要进行(mod p)操作
例2: GF(p)内 已知点 P 求 2P
已知 y^2 = x^3 - 2x -3 是 GF(7) 上的椭圆曲线,且P = (3,2) 求2P
解:
公式:① P = Q时 λ = (3 * (x1)^2 + a) / 2*y1
可以求出 λ = (3 * 3^2 + -2) / 2*2 = 25/4 (mod 7)
有限域内不会出现小数, 现在需要把λ化成整数
λ = 25/4 = 25 (mod7) * 4^(-1)(mod7) = 4 * 2 = 1 (mod7)
4^(-1)(mod7) 在求 4 的逆元 = 2
公式:x3 = λ^2 - x1 - x2
x3 = 1^2 - 3 - 3 = -5 (mod 7) = 2 (mod 7)
ps:化正数只需要负数加一个 p = 7,p是题目提供的
公式:y3 = λ*(x1 - x3) - y1
y3 = 1 * (3 - 2) - 2 = -1 (mod 7) = 6 (mod 7)
ps:化正数只需要负数加一个 p = 7,p是题目提供的
得出结果 2P(2,6)
例3:GF(p)内 已知点 P 求 3P
已知 y^2 = x^3 - 2x -3 是 GF(7) 上的椭圆曲线,且P = (3,2) 求3P
刚刚例2算出来了 2P(2,6) 那么3P = 2P+P
② P ≠ Q时 λ = (y2 - y1)/(x2 - x1)
2P ≠ P 所以
λ = (6-2)/(2-3) = -4 (mod 7) = 3 (mod 7)
公式:x3 = λ^2 - x1 - x2
x3 = 3^2 - 3 - 2 = 4 (mod 7)
公式:y3 = λ*(x1 - x3) - y1
y3 = 3 * (3-4) - 2 = -5 (mod 7) = 2 (mod 7)
得出结果 3P(4,2)
四、椭圆曲线上的解点
可以从上λ的计算公式上发现
② P ≠ Q时 λ = (y2 - y1)/(x2 - x1)
当 P ≠ Q 时 x1 = x2 的话 λ 是无法计算的
也就是在GF(p)中 解点是有限的
咱们只需要算出
P
2P = P + P
3P = 2P + P
...
nP = (n-1)P + P
我们找到 nP的上一位(n-1)P
(n-1)P = (Xn-1,Yn-1) 和 P = (X1,Y1) 中:
Xn-1 = X1 成立
那么我们就称 P到nP是该椭圆曲线的解点
且规定 : nP = O