A. 周立功燒錄器ECC演算法是什麼意思
ECC演算法基於一條橢圓曲線。曲線是一個多項式的圖形表達。多項式就有常量。那麼常量就是曲線的部分參數。
ECC演算法具有查錯、糾錯的功能,並且在NANDFLASH使用的絕大多數環境下,是需要ECC來確保可靠性的。由於ECC演算法很多,每個演算法個體又具有較強的可變性,且在Spare區存放的位置也不一樣,所以無法做成統一的演算法。
B. ecc演算法能在android上實現嗎用c好還是Java好
ECC演算法在android上是能夠實現的,使用Spongy Castle庫
C. IDEA加密演算法的C語言實現
1、數據加密的基本過程就是對原來為明文的文件或數據按某種演算法進行處理,使其成為不可讀的一段代碼,通常稱為「密文」,使其只能在輸入相應的密鑰之後才能顯示出本來內容,通過這樣的途徑來達到保護數據不被非法人竊取、閱讀的目的。
2、常見加密演算法
DES(Data Encryption Standard):數據加密標准,速度較快,適用於加密大量數據的場合;
3DES(Triple DES):是基於DES,對一塊數據用三個不同的密鑰進行三次加密,強度更高;
RC2和 RC4:用變長密鑰對大量數據進行加密,比 DES 快;
IDEA(International Data Encryption Algorithm)國際數據加密演算法:使用 128 位密鑰提供非常強的安全性;
RSA:由 RSA 公司發明,是一個支持變長密鑰的公共密鑰演算法,需要加密的文件塊的長度也是可變的;
DSA(Digital Signature Algorithm):數字簽名演算法,是一種標準的 DSS(數字簽名標准);
AES(Advanced Encryption Standard):高級加密標准,是下一代的加密演算法標准,速度快,安全級別高,目前 AES 標準的一個實現是 Rijndael 演算法;
BLOWFISH,它使用變長的密鑰,長度可達448位,運行速度很快;
其它演算法,如ElGamal、Deffie-Hellman、新型橢圓曲線演算法ECC等。
比如說,MD5,你在一些比較正式而嚴格的網站下的東西一般都會有MD5值給出,如安全焦點的軟體工具,每個都有MD5。
3、常式:
#include<stdio.h>
#include<process.h>
#include<conio.h>
#include<stdlib.h>
#definemaxim65537
#definefuyi65536
#defineone65536
#defineround8
unsignedintinv(unsignedintxin);
unsignedintmul(unsignedinta,unsignedintb);
voidcip(unsignedintIN[4],unsignedintOUT[4],unsignedintZ[7][10]);
voidkey(unsignedintuskey[9],unsignedintZ[7][10]);
voidde_key(unsignedintZ[7][10],unsignedintDK[7][10]);
voidmain()
{
inti,j,k,x;
unsignedintZ[7][10],DK[7][10],XX[5],TT[5],YY[5];
unsignedintuskey[9];
FILE*fpout,*fpin;
printf(" InputKey");
for(i=1;i<=8;i++)
scanf("%6u",&uskey[i]);
for(i=0;i<9;i++)
uskey[i]=100+i*3;
key(uskey,Z);/*產生加密子密鑰*/
de_key(Z,DK);/*計算解密子密鑰*/
if((fpin=fopen("ekey.txt","w"))==NULL)
{
printf("cannotopenfile!");
exit(EXIT_FAILURE);
}
for(i=0;i<7;i++)
{
for(j=0;j<10;j++)
fprintf(fpin,"%6u",Z[i][j]);
fprintf(fpin," ");
}
fclose(fpin);
/*XX[1..5]中為明文*/
for(i=0;i<4;i++)XX[i]=2*i+101;
clrscr();
printf("Mingwen%6u%6u%6u%6u ",XX[0],XX[1],XX[2],XX[3]);
if((fpin=(fopen("ideaming.txt","w")))==NULL)
{printf("cannotopenfile!");
exit(EXIT_FAILURE);
}
fprintf(fpin,"%6u,%6u,%6u,%6u ",XX[0],XX[1],XX[2],XX[3]);
fclose(fpin);
for(i=1;i<=30000;i++)
cip(XX,YY,Z);/*用密鑰Z加密XX中的明文並存在YY中*/
printf(" Mingwen%6u%6u%6u%6u ",YY[0],YY[1],YY[2],YY[3]);
if((fpin=fopen("ideamiwn.txt","w"))==NULL)
{
printf("cannotopenfile!");
exit(EXIT_FAILURE);
}
fprintf(fpout,"%6u%6u%6u%6u ",YY[0],YY[1],YY[2],YY[3]);
{
printf("cannotopenfile!");
exit(EXIT_FAILURE);
}
fprintf(fpout,"%6u%6u%6u%6u ",YY[0],YY[1],YY[2],YY[3]);
fclose(fpout);
for(i=1;i<=30000;i++)
cip(YY,TT,DK);/*encipherYYtoTTwithKeyDK*/
printf(" JieMi%6u%6u%6u%6u ",TT[0],TT[1],TT[2],TT[3]);
if((fpout=fopen("dideaout.txt","w"))==NULL)
{
printf("cannotopenfile!");
exit(EXIT_FAILURE);
}
fprintf(fpout,"%6u%6u%6u%6u ",TT[0],TT[1],TT[2],TT[3]);
fclose(fpout);
}
/*此函數執行IDEA演算法中的加密過程*/
voidcip(unsignedintIN[4],unsignedintOUT[4],unsignedintZ[7][10])
{
unsignedintr,x1,x2,x3,x4,kk,t1,t2,a;
x1=IN[0];x2=IN[1];x3=IN[2];x4=IN[3];
for(r=1;r<=8;r++)
{
/*對64位的塊進行分組運算*/
x1=mul(x1,Z[1][r]);x4=mul(x4,Z[4][r]);
x2=x2+Z[2][r]&one;x3=(x3+Z[3][r])&one;
/*MA結構的函數*/
kk=mul(Z[5][r],(x1^x3));
t1=mul(Z[6][r],(kk+(x2^x4))&one;
/*隨機變換PI*/
x1=x1^t1;x4=x4^t2;a=x2^t2;x2=x3^t1;x3=a;
}
/*輸出轉換*/
OUT[0]=mul(x1,Z[1][round+1]);
OUT[3]=mul(x4,Z[1][round+1]);
OUT[1]=(x3+Z[2][round+1])&one;
OUT[2]=(x2+Z[3][round+1])&one;
}
/*用高低演算法上實現乘法運算*/
unsignedintmul(unsignedinta,unsignedintb)
{
longintp;
longunsignedq;
if(a==0)p=maxim-b;
elseif(b==0)p=maxim-a;
else
{
q=(unsignedlong)a*(unsignedlong)b;
p=(q&one)-(q>>16);
if(p<=0)p=p+maxim;
{
return(unsigned)(p&one);
}
/*通過Euclideangcd演算法計算xin的倒數*/
unsignedintinv(unsignedintxin)
{
longn1,n2,q,r,b1,b2,t;
if(xin==0)
b2=0;
else
{n1=maxim;n2=xin;b2=1;b1=0;
do{
r=(n1%n2);q=(n1-r)/n2;
if(r==0)
if(b2<0)b2=maxim+b2;
else
{n1=n2;n2=r;
t=b2;
b2=b1-q*b2;b1=t;
}
}while(r!=0);
}
return(unsignedlongint)b2;
}
/*產生加密子密鑰Z*/
voidkey(unsignedintuskey[9],unsignedintZ[7][10])
{
unsignedintS[54];
inti,j,r;
for(i=1;i<9;i++)
S[i-1]=uskey[i];
/*shifts*/
for(i=8;i<54;i++)
{
if(i+2)%8==0)/*對於S[14],S[22],...進行計算*/
S[i]=((S[i-7]<<0)^(S[i-14]>>7)&one;
elseif((i+1)%8==0)/*對於S[15],S[23],...進行計算*/
S[i]=((S[i-15]<<9)^(S[i-14]>>7)&one;
else
S[i]=((S[i-7]<<9)^(S[i-6]>>7)&one;
}
/*取得子密鑰*/
for(r=1;r<=round+1;r++)
for(j=1;j<7;j++)
Z[j][r]=S[6*(r-1)+j-1];
}
/*計算解子密鑰DK*/
voidde_key(unsignedintZ[7][10],unsignedintDK[7][10])
{
intj;
for(j=1;j<=round+1;j++)
{DK[1][round-j+2]=inv(Z[1][j]);
DK[4][round-j+2]=inv(Z[4][j]);
if(i==1|j==round+1)
{
DK[2][round-j+2]=(fuyi-Z[2][j])&one;
DK[3][round-j+2]=(fuyi-Z[3][j])&one;
}
else
{
DK[2][round-j+2]=inv(Z[3][j]);
DK[3][round-j+2]=inv(Z[2][j]);
}
}
for(j=1;j<=round+1;j++)
{
DK[5][round-j+2]=inv(Z[5][j]);
DK[6][round-j+2]=inv(Z[6][j]);
}
}
D. 橢圓曲線加密(ECC)核心演算法的簡明介紹
網上對於橢圓曲線加密過程的介紹過於繁瑣,對於只想了解加密如何進行的人來說浪費時間,所以我這里只對關鍵計算步驟進行介紹,略去橢圓曲線的相關原理(網路一搜一大把)。
最最關鍵且基本只用到的是 Ep(a,b)的加法
對與橢圓曲線y^2 = x^3+ax+b(mod p) :
兩點P(x1,y1) Q(x2,y2),P≠-Q,則P+Q=(x3,y3)由以下演算法定義:
實際通信流程如下:
再對點M進行解碼就可以得到明文。上述流程中的加法即為Ep(a,b)的加法。
這個演算法實際是基於已知kG難解k實現的,簡單清晰。
E. ECC 演算法簡介
與 RSA(Ron Rivest,Adi Shamir,Len Adleman 三位天才的名字)一樣,ECC(Elliptic Curves Cryptography,橢圓曲線加密)也屬於公開密鑰演算法。
一、從平行線談起
平行線,永不相交。沒有人懷疑把:)不過到了近代這個結論遭到了質疑。平行線會不會在很遠很遠的地方相交了?事實上沒有人見到過。所以「平行線,永不相交」只是假設(大家想想初中學習的平行公理,是沒有證明的)。
既然可以假設平行線永不相交,也可以假設平行線在很遠很遠的地方相交了。即平行線相交於無窮遠點P∞(請大家閉上眼睛,想像一下那個無窮遠點P∞,P∞是不是很虛幻,其實與其說數學鍛煉人的抽象能力,還不如說是鍛煉人的想像力)。
給個圖幫助理解一下:
直線上出現P∞點,所帶來的好處是所有的直線都相交了,且只有一個交點。這就把直線的平行與相交統一了。為與無窮遠點相區別把原來平面上的點叫做平常點。
以下是無窮遠點的幾個性質。
直線 L 上的無窮遠點只能有一個。(從定義可直接得出)
平面上一組相互平行的直線有公共的無窮遠點。(從定義可直接得出)
平面上任何相交的兩直線 L1、L2 有不同的無窮遠點。(否則 L1 和 L2 有公共的無窮遠點 P ,則 L1 和 L2 有兩個交點 A、P,故假設錯誤。)
平面上全體無窮遠點構成一條無窮遠直線。(自己想像一下這條直線吧)
平面上全體無窮遠點與全體平常點構成射影平面。
二、射影平面坐標系
射影平面坐標系是對普通平面直角坐標系(就是我們初中學到的那個笛卡兒平面直角坐標系)的擴展。我們知道普通平面直角坐標系沒有為無窮遠點設計坐標,不能表示無窮遠點。為了表示無窮遠點,產生了射影平面坐標系,當然射影平面坐標系同樣能很好的表示舊有的平常點(數學也是「向下兼容」的)。
我們對普通平面直角坐標繫上的點A的坐標(x, y)做如下改造:
令 x=X/Z ,y=Y/Z(Z≠0);則 A 點可以表示為(X:Y:Z)。
變成了有三個參量的坐標點,這就對平面上的點建立了一個新的坐標體系。
例 2.1:求點(1,2)在新的坐標體系下的坐標。
解:
∵X/Z=1 ,Y/Z=2(Z≠0)
∴X=Z,Y=2Z
∴坐標為(Z:2Z:Z),Z≠0。
即(1:2:1)(2:4:2)(1.2:2.4:1.2)等形如(Z:2Z:Z),Z≠0 的坐標,都是(1,2)在新的坐標體系下的坐標。
我們也可以得到直線的方程 aX+bY+cZ=0(想想為什麼?提示:普通平面直角坐標系下直線一般方程是 ax+by+c=0)。
新的坐標體系能夠表示無窮遠點么?那要讓我們先想想無窮遠點在哪裡。根據上一節的知識,我們知道無窮遠點是兩條平行直線的交點。那麼,如何求兩條直線的交點坐標?這是初中的知識,就是將兩條直線對應的方程聯立求解。
平行直線的方程是:
aX+bY+c1Z =0;
aX+bY+c2Z =0 (c1≠c2); (為什麼?提示:可以從斜率考慮,因為平行線斜率相同);
將二方程聯立,求解。有
c2Z= c1Z= -(aX+bY)
∵c1≠c2
∴Z=0
∴aX+bY=0
所以無窮遠點就是這種形式(X:Y:0)表示。注意,平常點 Z≠0,無窮遠點 Z=0,因此無窮遠直線對應的方程是 Z=0。
例 2.2:求平行線 L1:X+2Y+3Z=0 與 L2:X+2Y+Z=0 相交的無窮遠點。
解:
因為 L1∥L2
所以有 Z=0, X+2Y=0
所以坐標為(-2Y:Y:0),Y≠0。
即(-2:1:0)(-4:2:0)(-2.4:1.2:0)等形如(-2Y:Y:0),Y≠0 的坐標,都表示這個無窮遠點。
看來這個新的坐標體系能夠表示射影平面上所有的點,我們就把這個能夠表示射影平面上所有點的坐標體系叫做射影平面坐標系。
練習:
1、求點A(2,4) 在射影平面坐標系下的坐標。
2、求射影平面坐標系下點(4.5:3:0.5),在普通平面直角坐標系下的坐標。
3、求直線X+Y+Z=0上無窮遠點的坐標。
4、判斷:直線aX+bY+cZ=0上的無窮遠點 和 無窮遠直線與直線aX+bY=0的交點,是否是同一個點?
三、橢圓曲線
上一節,我們建立了射影平面坐標系,這一節我們將在這個坐標系下建立橢圓曲線方程。因為我們知道,坐標中的曲線是可以用方程來表示的(比如:單位圓方程是 x2+y2=1)。橢圓曲線是曲線,自然橢圓曲線也有方程。
橢圓曲線的定義:
一條橢圓曲線是在射影平面上滿足如下方程的所有點的集合,且曲線上的每個點都是非奇異(或光滑)的。
Y2Z+a1XYZ+a3YZ2=X3+a2X2Z+a4XZ2+a6Z3 [3-1]
定義詳解:
Y2Z+a1XYZ+a3YZ2 = X3+a2X2Z+a4XZ2+a6Z3 是 Weierstrass 方程(維爾斯特拉斯,Karl Theodor Wilhelm Weierstrass,1815-1897),是一個齊次方程。
橢圓曲線的形狀,並不是橢圓的。只是因為橢圓曲線的描述方程,類似於計算一個橢圓周長的方程(計算橢圓周長的方程,我沒有見過,而對橢圓線 積分 (設密度為1)是求不出來的),故得名。
我們來看看橢圓曲線是什麼樣的。
所謂「非奇異」或「光滑」的,在數學中是指曲線上任意一點的偏導數 Fx(x,y,z),Fy(x,y,z),Fz(x,y,z) 不能同時為0。如果你沒有學過高等數學,可以這樣理解這個詞,即滿足方程的任意一點都存在切線。下面兩個方程都不是橢圓曲線,盡管他們是方程 [3-1] 的形式,因為他們在(0:0:1)點處(即原點)沒有切線。
橢圓曲線上有一個無窮遠點O∞(0:1:0),因為這個點滿足方程[3-1]。
知道了橢圓曲線上的無窮遠點。我們就可以把橢圓曲線放到普通平面直角坐標繫上了。因為普通平面直角坐標系只比射影平面坐標系少無窮遠點。我們在普通平面直角坐標繫上,求出橢圓曲線上所有平常點組成的曲線方程,再加上無窮遠點O∞(0:1:0),不就構成橢圓曲線了么?
我們設 x=X/Z,y=Y/Z 代入方程 [3-1] 得到:
y2+a1xy+a3y = x3+a2x2+a4x+a6 [3-2]
也就是說滿足方程 [3-2] 的光滑曲線加上一個無窮遠點O∞,組成了橢圓曲線。為了方便運算,表述,以及理解,今後論述橢圓曲線將主要使用 [3-2] 的形式。
本節的最後,我們談一下求橢圓曲線一點的切線斜率問題。由橢圓曲線的定義可以知道,橢圓曲線是光滑的,所以橢圓曲線上的平常點都有切線。而切線最重要的一個參數就是斜率 k 。
例 3.1:求橢圓曲線方程 y2+a1xy+a3y=x3+a2x2+a4x+a6上,平常點 A(x,y) 的切線的斜率 k 。
解:
令
F(x,y)= y2+a1xy+a3y-x3-a2x2-a4x-a6
求偏導數
Fx(x,y)= a1y-3x2-2a2x-a4
Fy(x,y)= 2y+a1x+a3
則導數為:
f'(x)=- Fx(x,y)/ Fy(x,y)=-( a1y-3x2-2a2x-a4)/(2y+a1x +a3) = (3x2+2a2x+a4-a1y) /(2y+a1x +a3)
所以
k=(3x2+2a2x+a4-a1y) /(2y+a1x +a3) [3-3]
看不懂解題過程沒有關系,記住結論[3-3]就可以了。
練習:
1、將給出圖例的橢圓曲線方程Y2Z=X3-XZ2 和Y2Z=X3+XZ2+Z3轉換成普通平面直角坐標繫上的方程。
四、橢圓曲線上的加法
上一節,我們已經看到了橢圓曲線的圖象,但點與點之間好象沒有什麼聯系。我們能不能建立一個類似於在實數軸上加法的運演算法則呢?天才的數學家找到了這一運演算法則
自從近世紀代數學引入了群、環、域的概念,使得代數運算達到了高度的統一。比如數學家總結了普通加法的主要特徵,提出了加群(也叫交換群,或 Abel(阿貝爾)群),在加群的眼中。實數的加法和橢圓曲線的上的加法沒有什麼區別。這也許就是數學抽象把。關於群以及加群的具體概念請參考近世代數方面的數學書。
運演算法則:任意取橢圓曲線上兩點 P、Q (若 P、Q兩點重合,則做 P 點的切線)做直線交於橢圓曲線的另一點 R』,過 R』 做 y 軸的平行線交於 R。我們規定 P+Q=R。(如圖)
法則詳解:
這里的 + 不是實數中普通的加法,而是從普通加法中抽象出來的加法,他具備普通加法的一些性質,但具體的運演算法則顯然與普通加法不同。
根據這個法則,可以知道橢圓曲線無窮遠點 O∞ 與橢圓曲線上一點 P 的連線交於 P』,過 P』 作 y 軸的平行線交於 P,所以有 無窮遠點 O∞ + P = P 。這樣,無窮遠點 O∞ 的作用與普通加法中零的作用相當(0+2=2),我們把無窮遠點 O∞ 稱為零元。同時我們把 P』 稱為 P 的負元(簡稱,負P;記作,-P)。(參見下圖)
根據這個法則,可以得到如下結論 :如果橢圓曲線上的三個點 A、B、C,處於同一條直線上,那麼他們的和等於零元,即 A+B+C= O∞
k 個相同的點 P 相加,我們記作 kP。如下圖:P+P+P = 2P+P = 3P。
下面,我們利用 P、Q點的坐標 (x1,y1),(x2,y2),求出 R=P+Q 的坐標 (x4,y4)。
例 4.1:求橢圓曲線方程 y2+a1xy+a3y=x3+a2x2+a4x+a6 上,平常點 P(x1,y1),Q(x2,y2) 的和 R(x4,y4) 的坐標。
解:
(1)先求點 -R(x3,y3)
因為 P, Q, -R 三點共線,故設共線方程為
y=kx+b
其中,若 P≠Q (P,Q兩點不重合),則直線斜率
k=(y1-y2)/(x1-x2)
若 P=Q (P,Q兩點重合),則直線為橢圓曲線的切線,
故由例 3.1 可知:
k=(3x2+2a2x+a4 -a1y) /(2y+a1x+a3)
因此 P, Q, -R 三點的坐標值就是以下方程組的解:
y2+a1xy+a3y=x3+a2x2+a4x+a6 [1]
y=(kx+b) [2]
將 [2] 代入[1] 有
(kx+b)2+a1x(kx+b)+a3(kx+b) =x3+a2x2+a4x+a6 [3]
對 [3] 化為一般方程,根據三次方程根與系數關系(若方程x³+ax²+bx+c=0 的三個根是 x1、x2、x3,則: x1+x2+x3=-a,x1x2+x2x3+x3x1=b,x1x2x2=-c)
所以
-(x1+x2+x3)=a2-ka1-k2
x3=k2+ka1+a2+x1+x2 --------------------- 求出點 -R 的橫坐標
因為
k=(y1-y3)/(x1-x3)
故
y3=y1-k(x1-x3) ------------------------------ 求出點 -R 的縱坐標
(2)利用 -R 求 R
顯然有
x4=x3=k2+ka1+a2+x1+x2 -------------- 求出點 R 的橫坐標
而 y3 y4 為 x=x4 時 方程 y2+a1xy+a3y=x3+a2x2+a4x+a6 的解化為一般方程 y2+(a1x+a3)y-(x3+a2x2+a4x+a6)=0 , 根據二次方程根與系數關系(如果方程 ax²+bx+c=0 的兩根為 x1、x2,那麼 x1+x2=-b/a,x1x2=c/a)
得:
-(a1x+a3)=y3+y4
故
y4=-y3-(a1x+a3)=k(x1-x4)-y1-(a1x4+a3) ----- 求出點 R 的縱坐標
即:
x4=k2+ka1+a2+x1+x2
y4=k(x1-x4)-y1-a1x4-a3
本節的最後,提醒大家注意一點,以前提供的圖像可能會給大家產生一種錯覺,即橢圓曲線是關於 x 軸對稱的。事實上,橢圓曲線並不一定關於 x 軸對稱。如下圖的 y2-xy=x3+1
五、密碼學中的橢圓曲線
我們現在基本上對橢圓曲線有了初步的認識,這是值得高興的。但請大家注意,前面學到的橢圓曲線是連續的,並不適合用於加密。所以,我們必須把橢圓曲線變成離散的點。
讓我們想一想,為什麼橢圓曲線為什麼連續?是因為橢圓曲線上點的坐標,是實數的(也就是說前面講到的橢圓曲線是定義在實數域上的),實數是連續的,導致了曲線的連續。因此,我們要把橢圓曲線定義在有限域上(顧名思義,有限域是一種只有由有限個元素組成的域)。
域的概念是從我們的有理數,實數的運算中抽象出來的,嚴格的定義請參考近世代數方面的數。簡單的說,域中的元素同有理數一樣,有自己得加法、乘法、除法、單位元(1),零元(0),並滿足交換率、分配率。
下面,我們給出一個有限域 Fp,這個域只有有限個元素。
Fp 中只有 p(p為素數)個元素 0, 1, 2 …… p-2, p-1
Fp 的加法(a+b)法則是 a+b≡c (mod p) ,即 (a+c)÷p 的余數和 c÷p 的余數相同。
Fp 的乘法(a×b)法則是 a×b≡c (mod p)
Fp 的除法(a÷b)法則是 a/b≡c (mod p),即 a×b-1≡c (mod p) ,b-1 也是一個 0 到 p-1 之間的整數,但滿足 b×b-1≡1 (mod p);具體求法可以參考初等數論。
Fp 的單位元是 1,零元是 0。
同時,並不是所有的橢圓曲線都適合加密。y2=x3+ax+b是一類可以用來加密的橢圓曲線,也是最為簡單的一類。下面我們就把 y2=x3+ax+b 這條曲線定義在 Fp 上:
選擇兩個滿足下列條件的小於 p ( p 為素數) 的非負整數 a、b
4a3+27b2≠0 (mod p)
則滿足下列方程的所有點 (x,y),再加上 無窮遠點 O∞ ,構成一條橢圓曲線。
y2=x3+ax+b (mod p)
其中 x,y 屬於 0 到 p-1 間的整數,並將這條橢圓曲線記為 Ep(a,b)。
我們看一下 y2=x3+x+1 (mod 23) 的圖像
是不是覺得不可思議?橢圓曲線,怎麼變成了這般模樣,成了一個一個離散的點?橢圓曲線在不同的數域中會呈現出不同的樣子,但其本質仍是一條橢圓曲線。舉一個不太恰當的例子,好比是水,在常溫下,是液體;到了零下,水就變成冰,成了固體;而溫度上升到一網路,水又變成了水蒸氣。但其本質仍是 H2O。
Fp上的橢圓曲線同樣有加法,但已經不能給以幾何意義的解釋。不過,加法法則和實數域上的差不多,請讀者自行對比。
1. 無窮遠點 O∞ 是零元,有 O∞ + O∞ = O∞,O∞ + P = P
2. P(x,y) 的負元是 (x,-y),有 P + (-P) = O∞
3. P(x1,y1), Q(x2,y2) 的和 R(x3,y3) 有如下關系:
x3≡k2-x1-x2(mod p)
y3≡k(x1-x3)-y1(mod p)
其中
若 P=Q 則 k=(3x2+a)/2y1
若 P≠Q 則 k=(y2-y1)/(x2-x1)
例 5.1:已知 E23(1,1) 上兩點 P(3,10),Q(9,7),求 (1)-P,(2)P+Q,(3) 2P。
解:
(1) –P的值為(3,-10)
(2) k=(7-10)/(9-3)=-1/2
2 的乘法逆元為 12, 因為 2*12≡1 (mod 23)
k≡-1*12 (mod 23)
故 k=11
x=112-3-9=109≡17 (mod 23)
y=11[3-(-6)]-10=89≡20 (mod 23)
故 P+Q 的坐標為 (17,20)
3) k=[3(32)+1]/(2*10)=1/4≡6 (mod 23)
x=62-3-3=30≡20 (mod 23)
y=6(3-7)-10=-34≡12 (mod 23)
故 2P 的坐標為 (7,12)
最後,我們講一下橢圓曲線上的點的階。如果橢圓曲線上一點 P,存在最小的正整數 n,使得數乘 nP=O∞,則將 n 稱為 P 的階,若 n 不存在,我們說 P 是無限階的。 事實上,在有限域上定義的橢圓曲線上所有的點的階 n 都是存在的(證明,請參考近世代數方面的書)
練習:
1. 求出 E11(1,6) 上所有的點。
2.已知 E11(1,6) 上一點 G(2,7),求 2G 到 13G 所有的值。
六、橢圓曲線上簡單的加密/解密
公開密鑰演算法總是要基於一個數學上的難題。比如 RSA 依據的是:給定兩個素數 p、q 很容易相乘得到 n,而對 n 進行因式分解卻相對困難。那橢圓曲線上有什麼難題呢?
考慮如下等式:
K=kG [其中 K, G為 Ep(a,b) 上的點,k 為小於 n(n 是點 G 的階)的整數]
不難發現,給定 k 和 G,根據加法法則,計算 K 很容易;但給定 K 和 G,求 k 就相對困難了。這就是橢圓曲線加密演算法採用的難題。我們把點 G 稱為基點(base point),k(key point)就是私有密鑰。
現在我們描述一個利用橢圓曲線進行加密通信的過程:
1、用戶 A 選定一條橢圓曲線 Ep(a,b),並取橢圓曲線上一點,作為基點 G。
2、用戶 A 選擇一個私有密鑰 k,並生成公開密鑰 K=kG。
3、用戶 A 將 Ep(a,b) 和點 K,G 傳給用戶 B。
4、用戶 B 接到信息後,將待傳輸的明文編碼到 Ep(a,b) 上一點 M(編碼方法很多,這里不作討論),並產生一個隨機整數 r(random)。
5、用戶 B 計算點 C1=M+rK;C2=rG。
6、用戶 B 將 C1、C2 傳給用戶A。
7、用戶 A 接到信息後,計算 C1-kC2,結果就是點 M。因為 C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M ,再對點 M 進行解碼就可以得到明文。
在這個加密通信中,如果有一個偷窺者 H ,他只能看到 Ep(a,b)、K、G、C1、C2 而通過 K、G 求 k 或通過 C2、G 求 r 都是相對困難的。因此,H 無法得到 A、B 間傳送的明文信息。
密碼學中,描述一條 Fp 上的橢圓曲線,常用到六個參量:
T=(p,a,b,G,n,h)
p 、a 、b 用來確定一條橢圓曲線,G 為基點,n 為點 G 的階,h 是橢圓曲線上所有點的個數 m 與 n 相除的整數部分。這幾個參量取值的選擇,直接影響了加密的安全性。參量值一般要求滿足以下幾個條件:
1、p 當然越大越安全,但越大,計算速度會變慢,200 位左右可以滿足一般安全要求;
2、p≠n×h;
3、pt≠1 (mod n),1≤t<20;
4、4a3+27b2≠0 (mod p);
5、n 為素數;
6、h≤4。
七、橢圓曲線簽名在軟體保護的應用
我們知道將公開密鑰演算法作為軟體注冊演算法的好處是:黑客很難通過跟蹤驗證演算法得到注冊機。下面,將簡介一種利用 Fp(a,b) 橢圓曲線進行軟體注冊的方法。
軟體作者按如下方法製作注冊機(也可稱為簽名過程)
1、選擇一條橢圓曲線 Ep(a,b) 和基點 G;
2、選擇私有密鑰 k;
3、產生一個隨機整數 r ;
4、將用戶名和點 R 的坐標值 x,y 作為參數,計算 SHA(Secure Hash Algorithm 安全散列演算法,類似於 MD5)值,即 Hash=SHA(username,x,y);
5、計算 sn≡r - Hash * k (mod n)
6、將 sn 和 Hash 作為用戶名 username 的序列號
軟體驗證過程如下:(軟體中存有橢圓曲線 Ep(a,b) 和基點 G 以及公開密鑰 K)
1、從用戶輸入的序列號中,提取 sn 以及 Hash;
2、計算點 R≡sn*G+Hash*K ( mod p ),如果 sn、Hash 正確,其值等於軟體作者簽名過程中點 R(x,y) 的坐標,
因為 sn≡r-Hash*k (mod n)
所以 sn*G+Hash*K=(r-Hash*k)*G+Hash*K=rG-Hash*kG+Hash*K=rG-Hash*K+Hash*K=rG=R;
3、將用戶名和點 R 的坐標值 x,y 作為參數,計算 H=SHA(username,x,y);
4、如果 H=Hash 則注冊成功,如果 H≠Hash ,則注冊失敗(為什麼?提示注意點 R 與 Hash 的關聯性)。
簡單對比一下兩個過程:
作者簽名用到了:橢圓曲線 Ep(a,b),基點 G,私有密鑰 k,及隨機數 r。
軟體驗證用到了:橢圓曲線 Ep(a,b),基點 G,公開密鑰 K。
黑客要想製作注冊機,只能通過軟體中的 Ep(a,b),點 G,公開密鑰 K ,並利用 K=kG 這個關系獲得 k 才可以,而求 k 是很困難的。
練習:
下面也是一種常於軟體保護的注冊演算法,請認真閱讀,並試回答簽名過程與驗證過程都用到了那些參數,黑客想製作注冊機,應該如何做。
軟體作者按如下方法製作注冊機(也可稱為簽名過程)
1、選擇一條橢圓曲線 Ep(a,b),和基點 G;
2、選擇私有密鑰 k;
3、產生一個隨機整數 r;
4、將用戶名作為參數,計算 Hash=SHA(username);
5、計算 x』=x (mod n)
6、計算 sn≡(Hash+x』*k)/r (mod n)
7、將 sn 和 x』 作為用戶名 username 的序列號
軟體驗證過程如下:(軟體中存有橢圓曲線 Ep(a,b) 和基點 G 以及公開密鑰 K)
1、從用戶輸入的序列號中,提取 sn 以及 x』;
2、將用戶名作為參數,計算 Hash=SHA(username);
3、計算 R=(Hash*G+x』*K)/sn,如果 sn、Hash 正確,其值等於軟體作者簽名過程中點 R(x,y)
因為 sn≡(Hash+x』*k)/r (mod n)
所以 (Hash*G+x』*K)/sn=(Hash*G+x』*K)/[(Hash+x』*k)/r]=(Hash*G+x』*K)/[(Hash*G+x』*k*G)/(rG)]=rG*[(Hash*G+x』*K)/(Hash*G+x』*K)]=rG=R (mod p)
4、v≡x (mod n)
5、如果 v=x』 則注冊成功。如果 v≠x』 ,則注冊失敗。
主要參考文獻
張禾瑞,《近世代數基礎》,高等 教育 出版社,1978
閔嗣鶴 嚴士健,《初等數論》,高等教育出版社,1982
段雲所,《網路信息安全》第三講,北大計算機系
Michael Rosing ,chapter5《Implementing Elliptic Curve Cryptography》,Softbound,1998
《SEC 1: Elliptic Curve Cryptography》,Certicom Corp.,2000
《IEEE P1363a / D9》,2001
F. 用ECC橢圓曲線加密漢字,密文是問號啊和不熟悉的漢字等組成。我希望加密後的漢字直接是01代碼,怎麼實現
保密年限到2030年,現在要採用224位以上的ECC。因為ECC加密過程是對點進行操作的,程序中是對二進制數進行運算,所以一定是將待加密的明文轉化為01代碼,然後01代碼通過ECC演算法轉化為其他的排序的01代碼,最後將01代碼轉化為亂碼的漢字。關於c++程序的問題,如果是你自己寫的,修改到把數據加密完就停止即可。
G. NandFlash中的ECC校驗的作用是先向NandFlash中寫數據再讀出來比較二者的ECC值,還是怎麼應用
ECC確實是寫入 spare area, ECC的值是根據寫入的數據計算出來的。讀出數據以後用數據計算ECC值然後與從spare area讀出的ECC值進行比較,如果不對則說明數據有問題。然後根據你具體使用多少位的ECC來判斷錯誤了多少位,如果在ECC的糾錯范圍內數據是可以恢復出來的,超出了ECC的糾錯范圍則數據只能是unrecoverble 了
H. 國密演算法
國密即國家密碼局認定的國產密碼演算法。主要有SM1,SM2,SM3,SM4。密鑰長度和分組長度均為128位。
SM1 為對稱加密。其加密強度與AES相當。該演算法不公開,調用該演算法時,需要通過加密晶元的介面進行調用。
SM2為非對稱加密,基於ECC。該演算法已公開。由於該演算法基於ECC,故其簽名速度與秘鑰生成速度都快於RSA。ECC 256位(SM2採用的就是ECC 256位的一種)安全強度比RSA 2048位高,但運算速度快於RSA。
國家密碼管理局公布的公鑰演算法,其加密強度為256位
SM3 消息摘要。可以用MD5作為對比理解。該演算法已公開。校驗結果為256位。
SM4 無線區域網標準的分組數據演算法。對稱加密,密鑰長度和分組長度均為128位。
由於SM1、SM4加解密的分組大小為128bit,故對消息進行加解密時,若消息長度過長,需要進行分組,要消息長度不足,則要進行填充。
分組密碼演算法(DES和SM4)、將明文數據按固定長度進行分組,然後在同一密鑰控制下逐組進行加密,
公鑰密碼演算法(RSA和SM2)、公開加密演算法本身和公開公鑰,保存私鑰
摘要演算法(SM3 md5) 這個都比較熟悉,用於數字簽名,消息認證,數據完整性,但是sm3安全度比md5高
總得來說國密演算法的安全度比較高,2010年12月推出,也是國家安全戰略,現在銀行都要要求國際演算法改造,要把國際演算法都給去掉
C 語言實現
https://github.com/guan/GmSSL/
Go 語言
https://github.com/tjfoc/gmsm
https://github.com/ZZMarquis/gm
Java 語言
https://github.com/PopezLotado/SM2Java
Go語言實現,調用 gmsm
I. 如何生成ECC演算法CSR文件
1.生成ECC演算法私鑰文件 openssl ecparam -genkey -name prime256v1 -out domain.key
2.生成ECC證書申請CSR文件 openssl req -new -sha265 -key domain.key -out domain_csr.txt
注意事項: ECC演算法加密強度有3個選項:prime256v1 /secp384r1/secp521r1,prime256v1 目前已經足夠安全,如無特殊需要請保持ECC演算法prime256v1 默認即可。 SHA256目前已經足夠安全,如無特殊需要請保持默認。
J. ECC橢圓曲線加密演算法(一)
btc address:
eth address:
隨著區塊鏈的大熱,橢圓曲線演算法也成了密碼學的熱門話題。在Bitcoin 生成地址 中使用到了橢圓曲線加密演算法。
橢圓曲線的一般表現形式:
橢圓曲線其實不是橢圓形的,而是下面的圖形:
Bitcoin使用了 secp256k1 這條特殊的橢圓曲線,公式是:
這個東西怎麼加密的呢?
19世紀挪威青年 尼爾斯·阿貝爾 從普通的代數運算中,抽象出了加群(也叫阿貝爾群或交換群),使得在加群中,實數的演算法和橢圓曲線的演算法得到了統一。是什麼意思呢?
我們在實數中,使用的加減乘除,同樣可以用在橢圓曲線中!
對的,橢圓曲線也可以有加法、乘法運算。
數學中的群是一個集合,我們為它定義了一個二元運算,我們稱之為「加法」,並用符號 + 表示。假定我們要操作的群用𝔾表示,要定義的 加法 必須遵循以下四個特性:
如果在增加第5個條件:
交換律:a + b = b + a
那麼,稱這個群為阿貝爾群。根據這個定義整數集是個阿貝爾群。
岔開一下話題, 伽羅瓦 與 阿貝爾 分別獨立的提出了群論,他們並稱為現代群論的創始人,可惜兩位天才都是英年早逝。
如上文所說,我們可以基於橢圓曲線定義一個群。具體地說:
在橢圓曲線上有 不重合且不對稱的 A 、B兩點,兩點與曲線相交於X點, X與 x軸 的對稱點為R,R即為 A+B 的結果。這就是橢圓曲線的加法定義。
因為橢圓曲線方程存在 項,因此橢圓曲線必然關於x軸對稱
曲線: ,
坐標:A=(2,5),B=(3,7)
A、B正好在曲線上,因為坐標滿足曲線公式
那如何找到相交的第三個點呢?
通過 A、B兩點確定直線方程,
設直線方程: ,m為直線的斜率
進一步得到c=1。
聯立方程:
X(-1,-1)的x坐標-1代入方式正好滿足方程,所以A、B兩點所在直線與曲線相交於 X(-1,-1),則點X的關於x軸的對稱點為R(-1,1),即A(2,5)+B(3,5)=R(-1,1)。
根據橢圓曲線的 群律(GROUP LAW) 公式,我們可以方便的計算R點。
曲線方程:
當A=(x1,y1),B=(x2,y2) ,R=A+B=(x3,y3),x1≠x2時,
, m是斜率
x3=
y3=m(x1-x3)-y1
A=(2,5), B=(3,7) , R=(-1,1) 符合上面的公式。
橢圓曲線加法符合交換律么?
先計算(A+B),在計算 A+B+C
先計算B+C, 在計算 B+C+A
看圖像,計算結果相同,大家手動算下吧。
那 A + A 呢, 怎麼計算呢?
當兩點重合時候,無法畫出 「過兩點的直線」,在這種情況下,
過A點做橢圓曲線的切線,交於X點,X點關於 x軸 的對稱點即為 2A ,這樣的計算稱為 「橢圓曲線上的二倍運算」。
下圖即為橢圓曲線乘法運算:
我們將在 ECC橢圓曲線加密演算法(二) 介紹有限域,橢圓曲線的離散對數問題,橢圓曲線加密就是應用了離散對數問題。
參考:
https://eng.paxos.com/blockchain-101-foundational-math
https://eng.paxos.com/blockchain-101-elliptic-curve-cryptography
https://andrea.corbellini.name/2015/05/17/elliptic-curve-cryptography-a-gentle-introction/