椭圆曲线入门详解

转载请注明http://blog.csdn.net/boksic 如有疑问欢迎留言


如果不知道数学上的群、循环群等概念,可以先了解ElGamal加密算法 后再回过来椭圆曲线加密

这两个算法有共通之处,都是在离散问题难解群上的加密算法,椭圆曲线是进一步的加深


首先,什么是椭圆曲线

椭圆曲线(Elliptic curve)

叫椭圆曲线只是因为方程跟椭圆的曲线积分比较相似

椭圆曲线方程可以统一为

当然还有要求
至于长什么样,绘个图看看

用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''))']);
椭圆曲线入门详解_第1张图片


再直观一点

(不得不说在这方面,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}]
椭圆曲线入门详解_第2张图片 椭圆曲线入门详解_第3张图片

"受ElGamal密码启发,在其它离散对数问题难解的群中,同样可以构成ELGamal密码。于是人们开始寻找其它离散问题难解的群。研究发现,有限域GF(p)上的椭圆曲线的解点构成交换群,而且离散对数问题是难解的。于是可在此群上建立ELGamal密码,并称为椭圆曲线密码。"


解点交换群

为了构成加法交换群,需要定义元素、单位元、逆元素、加法

解点

设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 = (yPyQ)/(xPxQ),即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



椭圆曲线交换群实例

对于标准方程y^2=x^3+ax+b (mod p) 设定基本参数

 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)

matlab显示一下,点的分布与顺序都是杂乱无章


椭圆曲线入门详解_第4张图片


你可能感兴趣的:(加密,String,matlab,callback,Mathematica,plot)