今天在學橢圓曲線密碼(Elliptic Curve Cryptography,ECC)算法,本身手裏缺乏介紹該算法的專業書籍,故在網上查了不少博文與書籍,可是大多數博客寫的真的是。。。你懂的。。。真不愧是 ‘天下文章一大抄’ 啊! 雷同不說,關鍵是介紹的都不是很清楚,是我在閱讀過程當中、產生的不少疑問沒法解決!例如:只來句‘P+Q=R’,可是爲何等於呢?是根據什麼計算出來的呢? 後來查了很久,才發現:這是規定的、是定義!瞬間非常無語!html
好了,不吐槽了,爲了方便你們對橢圓曲線密碼算法有系統的瞭解,我整理了幾篇較好的博文,並加上了本身的看法!算法
[ 時間有限、看法不深,如出現錯誤,歡迎指正!]安全
比特幣使用橢圓曲線算法生成公鑰和私鑰,選擇的是secp256k1曲線。學習
橢圓曲線密碼學(Elliptic Curve Cryptography) 的縮寫。該算法是基於橢圓曲線數學的一種公鑰密碼的算法,其安全性依賴於橢圓曲線離散對數問題的困難性。區塊鏈
在ECC流行起來以前,幾乎全部的公鑰算法都是基於RSA、DSA和DH ———— 基於模運算的可選加密系統。RSA及其友類算法在當前仍很是重要,常常與ECC一併使用。不過,RSA及其友類算法背後的原理很容易解釋,於是被普遍理解,一些簡單的實現也能夠很容易編寫出來;但ECC的實現基礎對於大多數人來講仍很神祕。編碼
具體來講,我將觸及如下主題:atom
1. 數學上的橢圓曲線及相關概念加密
2. 密碼學中的橢圓曲線spa
3. 橢圓曲線上的加密/解密設計
4. 橢圓曲線簽名與驗證簽名
1、數學上的橢圓曲線及相關概念
1.1 從平行線談起
平行線,永不相交。不過到了近代這個結論遭到了質疑。平行線會不會在很遠很遠的地方相交?事實上沒有人見到過。因此「平行線,永不相交」只是假設(你們想一想初中學習的平行公理,是沒有證實的)。既然能夠假設平行線永不相交,也能夠假設平行線在很遠很遠的地方相交了。即平行線相交於無窮遠點P∞(請你們閉上眼睛,想象一下那個無窮遠點P∞,P∞是否是很虛幻,其實與其說數學鍛鍊人的抽象能力,還不如說是鍛鍊人的想象力)。給個圖幫助理解一下:
直線上出現P∞點,所帶來的好處是全部的直線都相交了,且只有一個交點。這就把直線的平行與相交統一了。爲與無窮遠點相區別把原來平面上的點叫作日常點。
如下是無窮遠點的幾個性質。
▲直線L上的無窮遠點只能有一個。(從定義可直接得出)
▲平面上一組相互平行的直線有公共的無窮遠點。(從定義可直接得出)
▲ 平面上任何相交的兩直線L1,L2有不一樣的無窮遠點。(不然L1和L2有公共的無窮遠點P ,則L1和L2有兩個交點A、P,故假設錯誤。)
▲平面上全體無窮遠點構成一條無窮遠直線。(本身想象一下這條直線吧)
▲平面上全體無窮遠點與全體日常點構成射影平面。
1.2 射影平面座標系
射影平面座標系是對普通平面直角座標系(就是咱們初中學到的那個笛卡兒平面直角座標系)的擴展。咱們知道普通平面直角座標系沒有爲無窮遠點設計座標,不能表示無窮遠點。爲了表示無窮遠點,產生了射影平面座標系,固然射影平面座標系一樣能很好的表示舊有的日常點(數學也是「向下兼容」的)。
咱們對普通平面直角座標系上的點A的座標(x,y)作以下改造:
令x=X/Z ,y=Y/Z(Z≠0);則A點能夠表示爲(X:Y:Z)。
變成了有三個參量的座標點,這就對平面上的點創建了一個新的座標體系。
例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:求平行線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.3 橢圓曲線
上一節,咱們創建了射影平面座標系,這一節咱們將在這個座標系下創建橢圓曲線方程。由於咱們知道,座標中的曲線是能夠用方程來表示的(好比:單位圓方程是x2+y2=1)。橢圓曲線是曲線,天然橢圓曲線也有方程。
橢圓曲線的定義:
一條橢圓曲線是在射影平面上知足方程---------------------------[1-1]的全部點的集合,且曲線上的每一個點都是非奇異(或光滑)的。
定義詳解:
▲[1-1] 是Weierstrass方程(維爾斯特拉斯,Karl Theodor Wilhelm Weierstrass,1815-1897),是一個齊次方程。
▲ 橢圓曲線的形狀,並非橢圓的。只是由於橢圓曲線的描述方程,相似於計算一個橢圓周長的方程,故得名。
咱們來看看橢圓曲線是什麼樣的。
▲ 所謂「非奇異」或「光滑」的,在數學中是指曲線上任意一點的偏導數Fx(x,y,z),Fy(x,y,z),Fz(x,y,z)不能同時爲0。若是你沒有學太高等數學,能夠這樣理解這個詞,即知足方程的任意一點都存在切線。
下面兩個方程都不是橢圓曲線,儘管他們是方程[3-1]的形式。
由於他們在(0:0:1)點處(即原點)沒有切線。
▲橢圓曲線上有一個無窮遠點O∞(0:1:0),由於這個點知足方程[1-1]。
知道了橢圓曲線上的無窮遠點。咱們就能夠把橢圓曲線放到普通平面直角座標系上了。由於普通平面直角座標系只比射影平面座標系少無窮遠點。咱們在普通平面直角座標系上,求出橢圓曲線上全部日常點組成的曲線方程,再加上無窮遠點O∞(0:1:0),不就構成橢圓曲線了麼?
咱們設x=X/Z ,y=Y/Z代入方程[1-1]獲得:
y2+a1xy+a3y = x3+a2x2+a4x+a6 -------------------------[1-2]
也就是說知足方程[1-2]的光滑曲線加上一個無窮遠點O∞,組成了橢圓曲線。爲了方便運算,表述,以及理解,從此論述橢圓曲線將主要使用[1-2]的形式。
本節的最後,咱們談一下求橢圓曲線一點的切線斜率問題。
由橢圓曲線的定義能夠知道,橢圓曲線是光滑的,因此橢圓曲線上的日常點都有切線。而切線最重要的一個參數就是斜率k。
例3:求橢圓曲線方程上,日常點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)
因此 -------------[1-3]
看不懂解題過程沒有關係,記住結論[1-3]就能夠了。
1.4 橢圓曲線上的加法
上一節,咱們已經看到了橢圓曲線的圖象,但點與點之間好象沒有什麼聯繫。咱們能不能創建一個相似於在實數軸上加法的運算法則呢?天才的數學家找到了這一運算法則
自從近世紀代數學引入了羣、環、域的概念,使得代數運算達到了高度的統一。好比數學家總結了普通加法的主要特徵,提出了加羣(也叫交換羣,或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∞
同一直線上的三個點之和等於0.
注:咱們須要的只是三個點同線,與點的次序無關。這意味着,若是P、Q和R同線,那麼P + (Q + R) = Q + (P + R) = R + (P + Q) = • • • = 0. 這樣,咱們直觀地證實了咱們的「+」運算既知足結合律也知足交換律。
▲k個相同的點P相加,咱們記做kP。以下圖:P+P+P = 2P+P = 3P。
下面,咱們利用P、Q點的座標(x1,y1),(x2,y2),求出R=P+Q的座標(x4,y4)。
例4:求橢圓曲線方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]化爲通常方程,根據三次方程根與係數關係(當三次項係數爲1時;-x1x2x3 等於常數項係數, x1x2+x2x3+x3x1等於一次項係數,-(x1+x2+x3)等於二次項係數。)
因此-(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 , 根據二次方程根與係數關係得:
-(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
2、密碼學中的橢圓曲線
咱們如今基本上對橢圓曲線有了初步的認識,這是值得高興的。
但請你們注意,前面學到的橢圓曲線是連續的,並不適合用於加密;因此,咱們必須把橢圓曲線變成離散的點, 要把橢圓曲線定義在有限域上。
讓咱們想想,爲何橢圓曲線爲何連續?是由於橢圓曲線上點的座標,是實數的(也就是說前面講到的橢圓曲線是定義在實數域上的),實數是連續的,致使了曲線的連續。所以,咱們要把橢圓曲線定義在有限域上(顧名思義,有限域是一種只有由有限個元素組成的域)。
域的概念是從咱們的有理數,實數的運算中抽象出來的,嚴格的定義請參考近世代數方面的數。簡單的說,域中的元素同有理數同樣,有本身得加法、乘法、除法、單位元(1),零元(0),並知足交換率、分配率。
下面,咱們給出一個有限域Fp,這個域只有有限個元素。
Fp中只有p(p爲素數)個元素0,1,2 …… p-2,p-1;
Fp 的加法(a+b)法則是 a+b≡c (mod p);即,(a+b)÷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(mod p) 這條曲線定義在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: 已知橢圓曲線已知E23(1,1)上兩點P(3,10),Q(9,7),求(1)-P,(2)P+Q,(3) 2P
解:
最後,咱們講一下橢圓曲線上點的階。
若是橢圓曲線上一點P,存在最小的正整數n,使得數乘nP=O∞,則將n稱爲P的 階,若n不存在,咱們說P是無限階的。
事實上,在有限域上定義的橢圓曲線上全部的點的階n都是存在的。
計算可得27P=-P=(3,13)
因此28P=O ∞ P的階爲28
這些點作成了一個循環阿貝爾羣,其中生成元爲P,階數爲29。顯然點的分佈與順序都是雜亂無章
3、橢圓曲線上的加密/解密
公開密鑰算法老是要基於一個數學上的難題。好比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(k<n,n爲基點g的階)稱爲私有密鑰(privte key),
k稱爲公開密鑰(public="" key)。<="" p="">
如今咱們描述一個利用橢圓曲線進行加密通訊的過程:
一、用戶A選定一條橢圓曲線Ep(a,b),並取橢圓曲線上一點,做爲基點G。
二、用戶A選擇一個私有密鑰k,並生成公開密鑰K=kG。
三、用戶A將Ep(a,b)和點K,G傳給用戶B。
四、用戶B接到信息後 ,將待傳輸的明文編碼到Ep(a,b)上一點M(編碼方法不少,這裏不做討論),併產生一個隨機整數r(r<n)。
五、用戶B計算點C1=M+rK;C2=rG。
六、用戶B將C一、C2傳給用戶A。
七、用戶A接到信息後,計算C1-kC2,結果就是點M。
由於C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M再對點M進行解碼就能夠獲得明文。
在這個加密通訊中,若是有一個偷窺者H ,他只能看到Ep(a,b)、K、G、C一、C2 而經過K、G 求k 或經過C二、G求r 都是相對困難的。所以,H沒法獲得A、B間傳送的明文信息。
總結:
設私鑰、公鑰分別爲k、K,即K = kG,其中G爲G點。 公鑰加密: 選擇隨機數r,將消息M生成密文C,該密文是一個點對,即: C = {rG, M+rK},其中K爲公鑰 私鑰解密: M + rK - k(rG) = M + r(kG) - k(rG) = M 其中k、K分別爲私鑰、公鑰。
ECC技術要求:
密碼學中,描述一條Fp上的橢圓曲線,經常使用到六個參量:
T=(p,a,b,G,n,h)。
(p 、a 、b 用來肯定一條橢圓曲線,G爲基點,n爲點G的階,h 是橢圓曲線上全部點的個數m與n相除的整數部分)
這幾個參量取值的選擇,直接影響了加密的安全性。參量值通常要求知足如下幾個條件:
一、p 固然越大越安全,但越大,計算速度會變慢,200位左右能夠知足通常安全要求;
二、p≠n×h;
三、pt≠1 (mod n),1≤t<20;
四、4a3+27b2≠0 (mod p);
五、n 爲素數;
六、h≤4。
4、橢圓曲線簽名與驗證簽名
橢圓曲線簽名算法,即ECDSA。
設私鑰、公鑰分別爲k、K,即K = kG,其中G爲G點。
私鑰簽名:
一、選擇隨機數r,計算點rG(x, y)。
二、根據隨機數r、消息M的哈希h、私鑰k,計算s = (h + kx)/r。
三、將消息M、和簽名{rG, s}發給接收方。
公鑰驗證簽名:
一、接收方收到消息M、以及簽名{rG=(x,y), s}。
二、根據消息求哈希h。
三、使用發送方公鑰K計算:hG/s + xK/s,並與rG比較,如相等即驗籤成功。
原理以下:
hG/s + xK/s = hG/s + x(kG)/s = (h+xk)G/s
= r(h+xk)G / (h+kx) = rG
【時間倉促,若有錯誤,歡迎指正! || 歡迎留下您的評語! 你們一塊兒探討、學習區塊鏈!】
【轉載請註明出處!http://www.cnblogs.com/X-knight/】
REFERENCE
1.巴比特論壇 做者:ZMWorm http://8btc.com/article-138-1.html
2.張禾瑞,《近世代數基礎》,高等教育出版社,1978
3.閔嗣鶴 嚴士健,《初等數論》,高等教育出版社,1982