橢圓演算法的原理
1. 橢圓曲線點乘演算法
橢圓曲線密碼學有關的核心是橢圓曲線點乘演算法,
具體涉及到代數幾何學和群論。
原理太多,符號太雜不好往上打。
推薦你看下段鋼的《加密與解密》(第三版)
第六章有詳細介紹。
2. 橢圓曲線演算法的加密演算法
在橢圓曲線加密(ECC)中,利用了某種特殊形式的橢圓曲線,即定義在有限域上的橢圓曲線。其方程如下:
y²=x³+ax+b(mod p)
這里p是素數,a和b為兩個小於p的非負整數,它們滿足:
4a³+27b²(mod p)≠0 其中,x,y,a,b ∈Fp,則滿足式(2)的點(x,y)和一個無窮點O就組成了橢圓曲線E。
橢圓曲線離散對數問題ECDLP定義如下:給定素數p和橢圓曲線E,對 Q=kP,在已知P,Q的情況下求出小於p的正整數k。可以證明,已知k和P計算Q比較容易,而由Q和P計算k則比較困難,至今沒有有效的方法來解決這個問題,這就是橢圓曲線加密演算法原理之所在。
3. 橢圓加密演算法的優點
與經典的RSA,DSA等公鑰密碼體制相比,橢圓密碼體制有以下優點: 在私鑰的加密解密速度上,ecc演算法比RSA、DSA速度更快。
存儲空間佔用小。
帶寬要求低.
4. 橢圓曲線演算法的介紹
橢圓曲線指的是由韋爾斯特拉斯(Weierstrass)方程 y2+a1xy+a3y=x3+a2x2+a4x+a6 所確定的平面曲線。若F是一個域,ai ∈F,i=1,2,…,6。滿足式1的數偶(x,y)稱為F域上的橢圓曲線E的點。F域可以是有理數域,還可以是有限域GF(Pr)。橢圓曲線通常用E表示。除了曲線E的所有點外,尚需加上一個叫做無窮遠點的特殊點O。
5. 誰能最簡單的詳解橢圓曲線演算法,secp256k1 是如何生成公鑰和私鑰的
最簡單的描述,K=kG作者重新定義了橢圓曲線的加法和乘法。並且保證不可逆。之後通過一系列復雜的計算算出了公鑰和加密演算法。比如y^2=Ax^3+Bx^2+Cx+D然後Alice計算出來一個參數(x1,y1) 告訴A,B,C,D到Bob,Bob對應的計算出來(x2,y2)然後雙方通訊,就可以使用公鑰私鑰對進行加解密了。PS:對不起。具體細節我把書送給老師了。手頭沒有資料可以查PS:開始了解這個演算法的時候我也看了ECC加密演算法入門介紹。到現在都不懂。我也不是數學系的。PS:我很後悔當時沒有把這個書上的東西記下來。現在只有一點皮毛的。那本書是《深入淺出密碼學――常用加密技術原理與應用(安全技術經典譯叢)》(美)帕爾,(美)佩爾茨爾著,馬小婷譯PS:最後我很討厭很簡單的東西說的很復雜。在上面這本書大概幾面紙加上最基礎不超過兩位數的算例就解決的問題,上面硬是講的超級復雜。
6. 橢圓加密演算法的介紹
橢圓加密演算法(ECC)是一種公鑰加密體制,最初由Koblitz和Miller兩人於1985年提出,其數學基礎是利用橢圓曲線上的有理點構成Abel加法群上橢圓離散對數的計算困難性。
7. 橢圓的演算法
橢圓的基本演算法是按照橢圓方程,轉化成編程語言。
8. 橢圓成生演算法
設已知一長軸為len,及另一長軸的端點坐標(x1,y1)和(x2,y2)
求橢圓步驟:
1、求a,b: a=len/2 b=sqr((x1-x2)^2+(y1-y2)^2)
2、求旋轉角α :求出(y1-y2)/(x1-x2)的反正切值即為α
3、求橢圓中心坐標(x0,y0): x0=(x1+x2)/2 y0=(y1+y2)/2
3、計算橢圓上點的坐標(x,y):
x=acosθ , y=bsinθ ( 0<=θ< 2*π)
4、計算圖形繞原點旋轉α 弧度後的坐標(xx,yy):
xx=x*cos(-α )+y*sin(-α )
yy=-x*sin(-α )+y*cos(-α )
5、計算橢圓中心從原點平移到(x0,y0)後橢圓上點的坐標(xxx,yyy):
xxx=xx+x0
yyy=yy+y0
6、在坐標(xxx,yyy)處畫一各點
7、在( 0<=θ< 2*π)范圍內,按一定間隔取值,重復3-7步驟,即得所要求的橢圓。
以下是vb寫的簡單示例,新建一各工程,把代碼粘貼進去替換原來的所有代碼,運行即可看效果
Option Explicit
Dim X1, Y1, X0, Y0, X2, Y2 As Double
Dim A, B, PI As Double
Dim F As Boolean
Private Sub Form_Load()
PI = 3.14159265358979
F = False
DrawWidth = 2
Width = 10000
Height = 8000
End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
X1 = X
Y1 = Y
B = 1000
F = True
End Sub
Public Sub tuoYuan()
Dim Jiao As Double
Dim i, m, n, m1, n1 As Double
Cls
X0 = (X1 + X2) / 2
Y0 = (Y1 + Y2) / 2
A = Sqr((X0 - X2) ^ 2 + (Y0 - Y2) ^ 2)
If X1 <> X2 Then
Jiao = Atn((Y1 - Y2) / (X1 - X2))
Else
Jiao = PI / 2
End If
Form1.PSet (X1, Y1), RGB(255, 0, 0)
Form1.PSet (X0, Y0), RGB(255, 0, 0)
Form1.PSet (X2, Y2), RGB(255, 0, 0)
For i = 0 To PI * 2 Step 0.01
m = A * Cos(i)
n = B * Sin(i)
'Form1.PSet (m + X0, n + Y0), RGB(255, 0, 0)
m1 = m * Cos(-Jiao) + n * Sin(-Jiao)
n1 = -m * Sin(-Jiao) + n * Cos(-Jiao)
Form1.PSet (m1 + X0, n1 + Y0), RGB(0, 255, 0)
Next i
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If F = True Then
X2 = X
Y2 = Y
Call tuoYuan
End If
End Sub
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
F = False
X2 = X
Y2 = Y
Call tuoYuan
End Sub
9. java 橢圓演算法
以下代碼,將輸出一個橢圓,再有問題,我可遠程助你。如下:
/**
*(300,100)(400,100)
*
*/
importjava.awt.*;
importjavax.swing.*;
importjava.awt.event.*;
publicclassLipse
{
publicstaticvoidmain(String[]args)
{
newMainFrame();
}
}
{
JPanelpane=newJPanel();
JTextFieldT_a,T_b;
JButtonDraw,Show;
JLabelL_a,L_b;
inta,b;
MainFrame()
{
super("DrawLipseWindow");
Containercon=this.getContentPane();
con.setLayout(null);
pane.setBounds(20,20,850,550);
pane.setBackground(newColor(100,156,200));
con.add(pane);
L_a=newJLabel("請輸入長半徑:a");
L_a.setBounds(180,580,100,20);
con.add(L_a);
L_b=newJLabel("請輸入短半徑:b");
L_b.setBounds(180,630,100,20);
con.add(L_b);
T_a=newJTextField();
T_a.setBounds(300,580,50,20);
con.add(T_a);
T_b=newJTextField();
T_b.setBounds(300,630,50,20);
con.add(T_b);
Draw=newJButton("畫橢圓");
Draw.setBounds(550,580,90,30);
Draw.addActionListener(this);
con.add(Draw);
Show=newJButton("顯示坐標");
Show.setBounds(550,620,90,30);
Show.addActionListener(this);
con.add(Show);
this.addWindowListener(newCloseWindow());
this.setBounds(20,20,900,700);
this.setVisible(true);
this.setResizable(false);
}/*MainFrame()*/
publicvoidactionPerformed(ActionEvente)
{
if(e.getSource()==Draw)
{
a=Integer.parseInt(T_a.getText().trim());
b=Integer.parseInt(T_b.getText().trim());
Lineline=newLine(this);
line.drawLipse(a,b);
}
if(e.getSource()==Show)
{
Graphicsg1=this.pane.getGraphics();
g1.setColor(Color.PINK);
g1.drawLine(0,300,920,300);//----x---
g1.drawLine(410,0,410,720);//----y---
g1.dispose();
}
}/*methodactionPerformed*/
}
classLine
{
MainFramejb;
Line(MainFramejb)
{
this.jb=jb;
}
publicvoiddrawLipse(inta,intb)
{
intx,y;
doubled1,d2;
x=0;y=b;
d1=b*b+a*a*(-b+0.25);
Graphicsg=jb.pane.getGraphics();
g.setColor(Color.red);
g.drawLine(x+410,y+300,x+410,y+300);
g.drawLine(-x+410,-y+300,-x+410,-y+300);
g.drawLine(-x+410,y+300,x+410,-y+300);
g.drawLine(x+410,-y+300,x+410,-y+300);
try
{
while(b*b*(x+1)<a*a*(y-0.5))
{
if(d1<=0)
{
d1+=b*b*(2*x+3);
x++;
}
else
{
d1+=(b*b*(2*x+3)+a*a*(-2*y+2));
x++;
y--;
}
g.drawLine(x+410,y+300,x+410,y+300);
g.drawLine(-x+410,-y+300,-x+410,-y+300);
g.drawLine(-x+410,y+300,x+410,-y+300);
g.drawLine(x+410,-y+300,x+410,-y+300);
Thread.sleep(30);
}//topofwhile
}catch(Exceptione){}
d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;
try
{
while(y>0)
{
if(d2<=0)
{
d2+=b*b*(2*x+2)+a*a*(-2*y+3);
x++;
y--;
}
else
{
d2+=a*a*(-2*y+3);
y--;
}
g.drawLine(x+410,y+300,x+410,y+300);
g.drawLine(-x+410,-y+300,-x+410,-y+300);
g.drawLine(-x+410,y+300,x+410,-y+300);
g.drawLine(x+410,-y+300,x+410,-y+300);
Thread.sleep(30);
}/*bottomofwhile*/
}catch(Exceptione){}
}/*DrawLipse*/
}
{
publicvoidwindowClosing(WindowEvente)
{
System.exit(0);
}
}