橢圓曲線密碼算法(ECC)

網上有很多關於ECC的文章,但是講明白的很少,最近發現了一個大佬的博客,裏面將ECC的算法講的比較透徹,我當作自己的筆記來看。其中會對於一些細小的錯處做一些修改和添加一些自己的見解(大佬的博客地址和參考資料全部已經放在文章的末尾了)。

比特幣使用橢圓曲線算法生成公鑰和私鑰,選擇的是secp256k1曲線。

  橢圓曲線密碼學(ECC)是(Elliptic Curve Cryptography) 的縮寫,該算法是基於橢圓曲線數學的一種公鑰密碼的算法其安全性依賴於橢圓曲線離散對數問題的困難性(這句話能唬人用)。

  在ECC流行起來之前,幾乎所有的公鑰算法都是基於RSA、DSA和DH ———— 基於模運算的可選加密系統。RSA及其友類算法在當前仍非常重要,經常與ECC一併使用。不過,RSA及其友類算法背後的原理很容易解釋,因而被廣泛理解,一些簡單的實現也可以很容易編寫出來;但ECC的實現基礎對於大多數人來說仍很神祕。

       具體來說,我將觸及以下主題:

  1. 數學上的橢圓曲線及相關概念

  2. 密碼學中的橢圓曲線

  3. 橢圓曲線上的加密/解密

       4. 橢圓曲線簽名與驗證簽名

平行線,永不相交。沒有人懷疑吧。不過到了近代這個結論遭到了質疑。平行線會不會在很遠很遠的地方相交了?事實上沒有人見到過。所以“平行線,永不相交”只是假設(大家想想初中學習的平行公理,是沒有證明的)。既然可以假設平行線永不相交,也可以假設平行線在很遠很遠的地方相交了。即平行線相交於無窮遠點P∞(請大家閉上眼睛,想象一下那個無窮遠點P∞,P∞是不是很虛幻,其實與其說數學鍛鍊人的抽象能力,還不如說是鍛鍊人的想象力)。給個圖幫助理解一下:

                                            

直線上出現P∞點,所帶來的好處是所有的直線都相交了,且只有一個交點。這就把直線的平行與相交統一了。爲與無窮遠點相區別把原來平面上的點叫做平常點。

以下是無窮遠點的幾個性質:

       ▲直線L上的無窮遠點只能有一個。(從定義可直接得出)
  ▲平面上一組相互平行的直線有公共的無窮遠點。(從定義可直接得出)
  ▲平面上任何相交的兩直線L1,L2有不同的無窮遠點。(否則L1L2有公共的無窮遠點P ,則L1L2有兩個交點AP,故假設錯誤。)
  ▲平面上全體無窮遠點構成一條無窮遠直線。(自己想象一下這條直線吧)
  ▲平面上全體無窮遠點與全體平常點構成射影平面。

二、射影平面座標系

射影平面座標系是對普通平面直角座標系(就是我們初中學到的那個笛卡兒平面直角座標系)的擴展。我們知道普通平面直角座標系沒有爲無窮遠點設計座標,不能表示無窮遠點。爲了表示無窮遠點,產生了射影平面座標系,當然射影平面座標系同樣能很好的表示舊有的平常點(數學也是“向下兼容”的)。下圖爲普通平面直角座標系:

                                                          

 

 我們對普通平面直角座標系上的點A的座標(x,y)做如下改造:x=X/Z y=Y/ZZ0);則A點可以表示爲(X:Y:Z)。
變成了有三個參量的座標點,這就對平面上的點建立了一個新的座標體系。

我們也可以得到直線的方程aX+bY+cZ=0(想想爲什麼?提示:普通平面直角座標系下直線一般方程是ax+by+c=0)。

新的座標體系能夠表示無窮遠點麼?那要讓我們先想想無窮遠點在哪裏。根據上一節的知識,我們知道無窮遠點是兩條平行直線的交點。那麼,如何求兩條直線的交點座標?

這是初中的知識,就是將兩條直線對應的方程聯立求解。平行直線的方程是:

aX+bY+c1Z =0;

aX+bY+c2Z =0  (c1≠c2);
       我們知道平行線的斜率相同,把這個定理表現在普通直線方程上就是X和Y的係數a和b相等。

 將二方程聯立,求解。

        有c2Z= c1Z= -(aX+bY),

         ∵c1≠c2 ∴Z=0  ∴aX+bY=0;
      所以無窮遠點就是這種形式(X:Y:0)表示。

        注意,平常點Z≠0,因爲平常點的座標定義爲(X/Z,Y/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的座標,都表示這個無窮遠點。

看來這個新的座標體系能夠表示射影平面上所有的點,我們就把這個能夠表示射影平面上所有點的座標體系叫做射影平面座標系。

三、橢圓曲線

上一節,我們建立了射影平面座標系,這一節我們將在這個座標系下建立橢圓曲線方程。因爲我們知道,座標中的曲線是可以用方程來表示的(比如:單位圓方程是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]的形式。

知道了橢圓曲線上的無窮遠點。我們就可以把橢圓曲線放到普通平面直角座標系上了。因爲普通平面直角座標系只比射影平面座標系少無窮遠點。我們在普通平面直角座標系上,求出橢圓曲線上所有平常點組成的曲線方程,再加上無窮遠點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。

     

 

四、橢圓曲線上的加法

  上一節,我們已經看到了橢圓曲線的圖象,但點與點之間好象沒有什麼聯繫。我們能不能建立一個類似於在實數軸上加法的運算法則呢?天才的數學家找到了這一運算法則

  自從近世紀代數學引入了羣、環、域的概念,使得代數運算達到了高度的統一。比如數學家總結了普通加法的主要特徵,提出了加羣(也叫交換羣,或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)。(參見下圖)

                                                           

 

▲根據這個法則,可以得到如下結論 :如果橢圓曲線上的三個點ABC,處於同一條直線上,那麼他們的和等於零元,即A+B+C= O

▲k個相同的點P相加,我們記作kP。如下圖:P+P+P = 2P+P = 3P。

                                                

下面,我們利用P、Q點的座標(x1,y1),(x2,y2),求出R=P+Q的座標(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可知:

    因此P,Q,-R三點的座標值就是方程組:

           -----------------[1] 

        y=(kx+b)                                            -----------------[2]

   的解。

 將[2]代入[1] 有:

     --------[3]
            [3]化爲一般方程,根據三次方程根與係數關係(當三次項係數爲1時; 等於常數項係數,等於一次項係數,等於二次項係數。)所以

 (2)利用-RR

   

      化爲一般方程

     根據二次方程根與係數關係得:

---------------求出點R的縱座標

  即:


             本節的最後,提醒大家注意一點,以前提供的圖像可能會給大家產生一種錯覺,即橢圓曲線是關於x軸對稱的。事實上,橢圓曲線並不一定關於x軸對稱。如下圖的


                                                     
                 

五、密碼學中的橢圓曲線

  我們現在基本上對橢圓曲線有了初步的認識,這是值得高興的。但請大家注意,前面學到的橢圓曲線是連續的,並不適合用於加密;所以,我們必須把橢圓曲線變成離散的點。

  讓我們想一想,爲什麼橢圓曲線爲什麼連續?是因爲橢圓曲線上點的座標,是實數的(也就是說前面講到的橢圓曲線是定義在實數域上的),實數是連續的,導致了曲線的連續。因此,我們要把橢圓曲線定義在有限域上(顧名思義,有限域是一種只有由有限個元素組成的域)。

  域的概念是從我們的有理數,實數的運算中抽象出來的,嚴格的定義請參考近世代數方面的數。簡單的說,域中的元素同有理數一樣,有自己得加法、乘法、除法、單位元(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 這條曲線定義在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)的圖像

https://bbtcdn.8btc.com/data/attachment/portal/201310/01/014125z8timdmfvsu33o69.gif

是不是覺得不可思議?橢圓曲線,怎麼變成了這般模樣,成了一個一個離散的點?
  橢圓曲線在不同的數域中會呈現出不同的樣子,但其本質仍是一條橢圓曲線。舉一個不太恰當的例子,好比是水,在常溫下,是液體;到了零下,水就變成冰,成了固體;而溫度上升到一百度,水又變成了水蒸氣。但其本質仍是H2O

例題橢圓曲線已知E23(1,1)上兩點P(3,10)Q(9,7),求(1)-P(2)P+Q(3) 2P

https://images2017.cnblogs.com/blog/1180694/201708/1180694-20170818232047256-215454597.png

最後,我們講一下橢圓曲線上點的階。

  如果橢圓曲線上一點P,存在最小的正整數n,使得數乘nP=O∞,則將n稱爲P 階,若n不存在,我們說P是無限階的。
  事實上,在有限域上定義的橢圓曲線上所有的點的階n都是存在

https://images2018.cnblogs.com/blog/762938/201806/762938-20180607222648517-1849608117.png

計算可得27P=-P=(3,13)

  所以28P=O ∞ P的階爲28

  這些點做成了一個循環阿貝爾羣,其中生成元爲P,階數爲29。顯然點的分佈與順序都是雜亂無章

三、橢圓曲線上的加密/解密

  公開密鑰算法總是要基於一個數學上的難題。比如RSA 依據的是:給定兩個素數pq 很容易相乘得到n,而對n進行因式分解卻相對困難。那橢圓曲線上有什麼難題呢?

  考慮如下等式:
  K=kG  [其中 K,GEp(a,b)上的點,k爲小於nn是點G的階)的整數]
  不難發現,給定kG,根據加法法則,計算K很容易;但給定KG,求k就相對困難了。
  這就是橢圓曲線加密算法採用的難題。

  我們把點G稱爲基點(base point),

  kk<nn爲基點g的階)稱爲私有密鑰(privte key),

  k稱爲公開密鑰(public="" key)<="" p="">

  現在我們描述一個利用橢圓曲線進行加密通信的過程:

  1、用戶A選定一條橢圓曲線Ep(a,b),並取橢圓曲線上一點,作爲基點G
  2、用戶A選擇一個私有密鑰k,並生成公開密鑰K=kG
  3、用戶AEp(a,b)和點KG傳給用戶B
  4、用戶B接到信息後 ,將待傳輸的明文編碼到Ep(a,b)上一點M(編碼方法很多,這裏不作討論),併產生一個隨機整數rr<n)。
  5、用戶B計算點C1=M+rKC2=rG
  6、用戶BC1C2傳給用戶A
  7、用戶A接到信息後,計算C1-kC2,結果就是點M

  因爲C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M再對點M進行解碼就可以得到明文。

  在這個加密通信中,如果有一個偷窺者H ,他只能看到Ep(a,b)KGC1C2 而通過KG k 或通過C2Gr 都是相對困難的。因此,H無法得到AB間傳送的明文信息。

設私鑰、公鑰分別爲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 是橢圓曲線上所有點的個數mn相除的整數部分)

  這幾個參量取值的選擇,直接影響了加密的安全性。參量值一般要求滿足以下幾個條件:

  1p 當然越大越安全,但越大,計算速度會變慢,200位左右可以滿足一般安全要求;
  2p≠n×h
  3pt≠1 (mod n)1≤t<20
  44a3+27b2≠0 (mod p)
  5n 爲素數;
  6h≤4。
 

四、橢圓曲線簽名與驗證簽名

   橢圓曲線簽名算法,即ECDSA
  設私鑰、公鑰分別爲kK,即K = kG,其中GG點。
  私鑰簽名:
  1、選擇隨機數r,計算點rG(x, y)
  2、根據隨機數r、消息M的哈希h、私鑰k,計算s = (h + kx)/r
  3、將消息M、和簽名{rG, s}發給接收方。
  公鑰驗證簽名:
  1、接收方收到消息M、以及簽名{rG=(x,y), s}
  2、根據消息求哈希h
  3、使用發送方公鑰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

參考:
        https://www.cnblogs.com/X-knight/p/9153209.html

        https://www.chainnode.com/tutorial/138

       張禾瑞,《近世代數基礎》,高等教育出版社,1978 

       閔嗣鶴 嚴士健,《初等數論》,高等教育出版社,1982

       https://www.cnblogs.com/Kalafinaian/p/7392505.html



 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章