橢圓曲線
首先:什么是橢圓曲線,Wolfram MathWorld提供了出色而完整的定義。但是對於我們的目標,橢圓曲線將簡單表示為方程式所描述的點集:y^2=x^3+ax+b
其中4a^3+27b^2!=0
需要排除特殊曲線。上面的等式是橢圓曲線的Weierstrass范式。
下圖為奇異的橢圓曲線:
奇異點的類型:左側是具有尖點的曲線,y^2=x^3
右側是具有自相交的曲線,y^2=x^3-3x+2
這兩個曲線都不是有效的橢圓曲線。
根據不同的a
與b
的值,橢圓曲線在平面上可能具有不同的形狀。可以很容易看到和驗證的是,橢圓曲線是關於x
軸對稱的。
為了我們的目標,我們還需要一個無窮大的點(也稱為理想點)作為曲線的一部分。 從現在開始,我們將用符號0(零)表示無窮大點。
如果我們要明確考慮無窮大點,可以按如下方式改進橢圓曲線的定義:
群
數學上的群是一個集合,我們為其定義了一個二進制運算,我們稱之為“加法”,並用符號+表示。 為了使集合G成為一個群,必須定義添加項,以便它遵守以下四個屬性:
- 閉環: 如果
a
和b
為G中的成員,那么a+b
也是G中的成員. - 關聯:
(a+b)+c=a+(b+c)
. - 存在一個標識元素0使得
a+0=0+a=a
. - 每個元素都有其相反數,例如對於任意的數
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
,通過這種形式的方程,我們可以導出一種幾何方法來計算兩個點P
和Q
之間的和。如果我們畫一條穿過點P
和點Q
的線,該線將和橢圓曲線相交於第三點R
(表明了P,Q,R三點在穿過橢圓曲線的同一條直線上。
),如果我們找出點R
的相反數-R
,我們則找到了P+Q
相加的結果。
畫一條線穿過P
和Q
,該線則與橢圓曲線相交於第三點R
,與R
對稱的點-R
即為P+Q
的結果。
這種幾何方法有效,但需要改進。 並且,我們需要回答一些問題:
-
如果
P=0
或者Q=0
呢?當然,如果這樣的話將不能畫任何線(因為0不在坐標軸上)。但是鑒於我們已將0定義為標識元素,即對於任意的P
或者Q
,都有P=0=P,0+Q=Q
. -
如果
P=-Q
呢?在這種情況下,穿過兩點的線是垂直的,並且不與任何第三點相交。 但是,如果P
是Q
的相反數,則我們有相反數的定義P+Q=P+(-P)=0
。 -
如果
P=Q
呢?在這種情況下,有無限多的線穿過該點。 在這里,事情開始變得更加復雜。 但考慮一點Q'!=P
。如果我們將Q'
不斷靠近P
會怎樣?
當兩個點變得更靠近時,通過它們的線與曲線相切.
如果Q'
趨於P
,穿過點P
和Q'
的線變得與曲線相切。那么,我們可以說P+P=-R
,這里的R
為過點P
的與曲線相切的線與曲線相交的點。 -
如果
P!=Q
並且沒有與曲線相交的第三點呢?在這種情況下,與上一種情況非常相似。 實際上,在這種情況下,直線穿過P
與Q
並與曲線相切。
如果我們的線僅與曲線相交兩個點,則意味着它與曲線相切。 很容易看到總和的結果如何對稱於兩點之一。假設點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
- 將
P
與2P
相加,為了得到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)
如果我們考慮位長),這是相當不錯的。 當然比初始算法要好得多!
對數
給出n
和P
,我們現在至少有一個多項式時間算法可用於計算Q=nP
.但是反過來呢?如果我們知道Q
和P
是否可以計算出n
?,該問題稱為對數問題.為了與其他密碼系統保持一致,我們稱其為“對數”而不是“除法"(在這里不是乘法,而是取冪)。
我不知道有任何針對對數問題的“簡單”算法,但是通過乘法運算很容易看到一些模式。例如,給予曲線y^2=x^3-3x+1
和點P=(0,1)
,我們可以立即驗證,如果n
是奇數,則nP
在左半平面的曲線上;如果n
為偶數,則nP
在右半平面曲線上,如果我們進行更多的實驗,我們可能會發現更多的模式,這些模式最終可能導致我們編寫一種算法來有效地計算該曲線上的對數。
但是對數問題有一個變體:離散對數問題。 如我們在下一篇文章中將看到的,如果我們減小橢圓曲線的域,則標量乘法仍然“容易”,而離散對數則成為“困難”的問題。 這種對偶性是橢圓曲線密碼學的關鍵。
參考這里