转载请注明http://blog.csdn.net/boksic 如有疑问欢迎留言
如果不知道数学上的群、循环群等概念,可以先了解ElGamal加密算法 后再回过来椭圆曲线加密
这两个算法有共通之处,都是在离散问题难解群上的加密算法,椭圆曲线是进一步的加深
首先,什么是椭圆曲线
叫椭圆曲线只是因为方程跟椭圆的曲线积分比较相似
椭圆曲线方程可以统一为
用matlab写了一个模拟程序,可以控制a,b变化,显示曲线的图像。
clear;clc;figure(1); a=0; b=0; h_text1=uicontrol('Style','text','String','a','Position',[50 20 50 20]); h_text1=uicontrol('Style','text','String','b','Position',[50 0 50 20]); ezplot(strcat('x+',num2str(a),'*y')); h_slider1=uicontrol('Style','slider','Position',[100 20 200 20],... 'Max',10,'Min',-10,'callback',['a=num2str(get(gcbo,''value''));',... 'ezplot(strcat(num2str(b),''+x^3+'',num2str(a),''*x-y^2''))']); %h_text2=uicontrol('Style','text','String','b'); h_slider2=uicontrol('Style','slider','Position',[100 0 200 20],... 'Max',10,'Min',-10,'callback',['b=num2str(get(gcbo,''value''));',... 'ezplot(strcat(num2str(b),''+x^3+'',num2str(a),''*x-y^2''))']);
再直观一点
(不得不说在这方面,Mathematica比Matlab要方便强力太多,用MATLAB做这个图像速度慢代码长步骤复杂效果烂)
b=0,a在[-20,20]上变动时的图像 | a=-6,b在[-20,20]上变动时的图像 |
Plot3D[{(x^3+y*x)^0.5,-(x^3+y*x)^0.5},{x,-7,7},{y,-20,20}] | Plot3D[{(x^3-6x+y)^0.5,-(x^3-6x+y)^0.5},{x,-7,7},{y,20,-20}] |
为了构成加法交换群,需要定义元素、单位元、逆元素、加法
解点
设p是大于3的素数,且4a3+27b2 ≠0 mod p ,称
y^2 =x^3 +ax+b ,a,b∈GF(p)
为GF(p)上的椭圆曲线。
由椭圆曲线可得到一个同余方程:
y^2 =x^3 +ax+b mod p
其解为一个二元组<x,y>,x,y∈GF(p),将此二元组描画到椭圆曲线上便为一个点,于是又称其为解点。
单位元
引进一个无穷点O(∞,∞),简记为0,作为0元素。
O(∞,∞)+O(∞,∞)=0+0=0 。
并定义对于所有的解点P(x ,y)有
P(x ,y)+O=O+ P(x ,y)=P(x ,y)
逆元素任何解点R(x ,y)的逆就是 R(x ,-y)。
加法P(x1 ,y1)+Q(x2 ,y2)=R(x3 ,y3)
(提醒一下,这里的运算都是模运算,值都是整数,像除法是模逆运算)
定义s = (yP − yQ)/(xP −xQ),即PQ线的斜率
总共3种情况
1.一般情况下 R = P + Q = (xR, − yR)其中
2.如果xP = xQ,yP = −yQ(包括yP =yQ = 0的情形)
结果R就是无穷远点0
3 尽管xP = xQ但yP = yQ ≠ 0那么R =P +P = 2P = (xR,−yR)有
加法的几何意义
设P和Q是椭圆曲线的两个点,则连接P和Q的直线与椭圆曲线的另一交点关于横轴的对称点即为R点。在该群中P + Q + R = 0
p=31,a=2,b=17
随便找一个在曲线上(即满足该方程)的点P=(10,13)
然后按照上面提到的公式来逐一计算2P,3P,4P.....
我用的Python来计算(调用的mod_inv是模下的除运算,代码可参看前面的文章):
px,py=10,13 x,y=px,py a,b=2,17 p=31 for i in range(p+20): if(x==px and y==py): x3=(9*x**4-8*x*y**2+6*a*x**2+a**2)\ *mod_inv(4*y**2,p)%p y3=((3*x**2+a)*(x-x3)*mod_inv(2*y,p)-y)%p elif(x==px): x3,y3=0,0 elif(x==0 and y==0): x3,y3=px,py else: x3=(((y-py)*mod_inv(x-px,p))**2-x-px)%p y3=((y-py)*(px-x3)*mod_inv(x-px,p)-py)%p str = "%dP= (%d,%d)"%(i+2,x3,y3) print str, x,y=x3,y3
可以得到
2P= (21,19) 3P= (19,30) 4P= (27,10) 5P= (29,25) 6P= (24,1) 7P= (30,13) 8P= (22,18) 9P= (8,24) 10P= (20,11) 11P= (6,11) 12P= (23,27) 13P= (12,23) 14P= (3,22) 15P= (7,23) 16P= (1,19) 17P= (17,2) 18P= (9,12) 19P= (13,15) 20P= (5,11) 21P= (5,20) 22P= (13,16) 23P= (9,19) 24P= (17,29) 25P= (1,12) 26P= (7,8) 27P= (3,9) 28P= (12,8) 29P= (23,4) 30P= (6,20) 31P= (20,20) 32P= (8,7) 33P= (22,13) 34P= (30,18) 35P= (24,30) 36P= (29,6) 37P= (27,21) 38P= (19,1) 39P= (21,12) 40P= (10,18) 41P= (0,0) 42P= (10,13)