1. 程式人生 > 實用技巧 >橢圓曲線演算法:簡單介紹

橢圓曲線演算法:簡單介紹

橢圓曲線

首先:什麼是橢圓曲線,Wolfram MathWorld提供了出色而完整的定義。但是對於我們的目標,橢圓曲線將簡單表示為方程式所描述的點集:y^2=x^3+ax+b
其中4a^3+27b^2!=0
需要排除特殊曲線。上面的等式是橢圓曲線的Weierstrass正規化。

下圖為奇異的橢圓曲線:

奇異點的型別:左側是具有尖點的曲線,y^2=x^3
右側是具有自相交的曲線,y^2=x^3-3x+2
這兩個曲線都不是有效的橢圓曲線。

根據不同的ab的值,橢圓曲線在平面上可能具有不同的形狀。可以很容易看到和驗證的是,橢圓曲線是關於x軸對稱的。
為了我們的目標,我們還需要一個無窮大的點(也稱為理想點)作為曲線的一部分。 從現在開始,我們將用符號0(零)表示無窮大點。
如果我們要明確考慮無窮大點,可以按如下方式改進橢圓曲線的定義:

數學上的群是一個集合,我們為其定義了一個二進位制運算,我們稱之為“加法”,並用符號+表示。 為了使集合G成為一個群,必須定義新增項,以便它遵守以下四個屬性:

  1. 閉環: 如果abG中的成員,那麼a+b也是G中的成員.
  2. 關聯: (a+b)+c=a+(b+c).
  3. 存在一個標識元素0使得a+0=0+a=a.
  4. 每個元素都有其相反數,例如對於任意的數a都存在b使得a+b=0.

如果我們新增第五個要求:
可交換性:a+b=b+a
那麼符合以上屬性的群可以稱為阿貝爾群。
按照通常的加法概念,整數集Z也是一個群(也是一個阿貝爾群),但是,自然數的集合N不是一個群,因為無法滿足第四個屬性.
群具有很好的屬性,因為,如果我們可以證明這四個屬性成立,那麼我們可以免費獲得其他一些屬性。 例如:標識元素是唯一的

相反數也唯一,即:對於每個數a,僅存在一個這樣的b使得a+b=0(並且我們可以寫成b=-a)。 無論是直接還是間接,關於群的這些屬性和其他屬性對我們以後都將非常重要。

橢圓曲線的群屬性

我們可以在橢圓曲線上定義一個群。 尤其:

  • 該群的元素是橢圓曲線的點
  • 標識元素是無窮大的點0
  • 橢圓曲線上任意一點P的倒數是關於x軸對稱的點
  • 通過以下規則給出加法:給定同一條直線上三個的非零P,Q,R,他們的和P+Q+R=0.


注意,關於最後一條規則,我們只需要三個點在同一條直線上,並且三個點不考慮順序。這意味著,如果P,Q,R三點在同一條直線上,那麼總有P+(Q+R)=Q+(P+R)=R+(P+Q)=...=0


這樣,我們直觀地證明了+運算子既具有關聯性又具有可交換性:這些點屬於阿貝爾群。但是,我們實際上如何計算兩個任意點的和?

幾何加法

由於這些點在阿貝爾群中,我們可以寫為P+Q+R=0或者P+Q=-R,通過這種形式的方程,我們可以匯出一種幾何方法來計算兩個點PQ之間的和。如果我們畫一條穿過點P和點Q的線,該線將和橢圓曲線相交於第三點R(表明了P,Q,R三點在穿過橢圓曲線的同一條直線上。),如果我們找出點R的相反數-R,我們則找到了P+Q相加的結果。

畫一條線穿過PQ,該線則與橢圓曲線相交於第三點R,與R對稱的點-R即為P+Q的結果。
這種幾何方法有效,但需要改進。 並且,我們需要回答一些問題:

  • 如果P=0或者Q=0呢?當然,如果這樣的話將不能畫任何線(因為0不在座標軸上)。但是鑑於我們已將0定義為標識元素,即對於任意的P或者Q,都有P=0=P,0+Q=Q.

  • 如果P=-Q呢?在這種情況下,穿過兩點的線是垂直的,並且不與任何第三點相交。 但是,如果PQ的相反數,則我們有相反數的定義P+Q=P+(-P)=0

  • 如果P=Q呢?在這種情況下,有無限多的線穿過該點。 在這裡,事情開始變得更加複雜。 但考慮一點Q'!=P。如果我們將Q'不斷靠近P會怎樣?

    當兩個點變得更靠近時,通過它們的線與曲線相切.
    如果Q'趨於P,穿過點PQ'的線變得與曲線相切。那麼,我們可以說P+P=-R,這裡的R為過點P的與曲線相切的線與曲線相交的點。

  • 如果P!=Q並且沒有與曲線相交的第三點呢?在這種情況下,與上一種情況非常相似。 實際上,在這種情況下,直線穿過PQ並與曲線相切。

    如果我們的線僅與曲線相交兩個點,則意味著它與曲線相切。 很容易看到總和的結果如何對稱於兩點之一。假設點P是切點。 在前一種情況下,我們可以寫為P+P=-Q。 這個等式現在變成了P+Q=-P。 另一方面,如果點Q是相切點,則正確的方程式應為P+Q=-Q

幾何加法現已完成,考慮了所有情況。我們可以執行涉及任何橢圓曲線每個點的加法操作。 如果要嘗試,可以通過這裡線上測試.

代數加法

如果要計算機執行點加法,則需要將幾何方法轉換為代數方法。 將上述規則轉換為一組方程似乎很簡單,但實際上這可能非常乏味,因為它需要求解三次方程。 因此,在這裡僅報告結果。
首先,讓我們擺脫最煩人的極端情況。
Pending......

標量乘法

與加法不同,我們可以定義另一組操作,標量乘法

這裡的n是自然數,如上述式子,看起來計算nP需要n次加法。如果n具有k個二進位制數字,則演算法複雜度為O(2^k),這並不是很好,因此需要更快的演算法。
其中一種為倍乘演算法,比如n=151,可以用二進位制表示為10010111,該二進位制用加法可以表示為:

(我們取了n的每個二進位制數並乘以2的冪)
可以化簡為:

用倍乘演算法我們可以描述為:

  • 獲取P
  • 倍乘P,可以獲得2P
  • P2P相加,為了得到2^1*P + 2^0*P
  • 倍乘2P,可以獲得2^2*P
  • 再次相加,得到2^2*P+2^1*P + 2^0*P
  • ...

最後,通過7次倍乘和4次加法我們可以得到151P
如果倍乘和加法都是複雜度為O(1)的運算,那麼這個演算法複雜度就是O(log_n)(或者O(k)如果我們考慮位長),這是相當不錯的。 當然比初始演算法要好得多!

對數

給出nP,我們現在至少有一個多項式時間演算法可用於計算Q=nP.但是反過來呢?如果我們知道QP是否可以計算出n?,該問題稱為對數問題.為了與其他密碼系統保持一致,我們稱其為“對數”而不是“除法"(在這裡不是乘法,而是取冪)。
我不知道有任何針對對數問題的“簡單”演算法,但是通過乘法運算很容易看到一些模式。例如,給予曲線y^2=x^3-3x+1和點P=(0,1),我們可以立即驗證,如果n是奇數,則nP在左半平面的曲線上;如果n為偶數,則nP在右半平面曲線上,如果我們進行更多的實驗,我們可能會發現更多的模式,這些模式最終可能導致我們編寫一種演算法來有效地計算該曲線上的對數。

但是對數問題有一個變體:離散對數問題。 如我們在下一篇文章中將看到的,如果我們減小橢圓曲線的域,則標量乘法仍然“容易”,而離散對數則成為“困難”的問題。 這種對偶性是橢圓曲線密碼學的關鍵。

參考這裡