區塊鏈技術筆記:橢圓曲線密碼學是什麼?

橢圓曲線加密法是一種基於離散對數問題的非對稱(或公鑰)加密法,可以用對橢圓曲線上的點進行加法或乘法運算來表達。

區塊鏈技術筆記:橢圓曲線密碼學是什麼?

上圖是一個橢圓曲線的示例,類似於比特幣所用的曲線。

比特幣使用了secp256k1標準所定義的一條特殊的橢圓曲線和一系列數學常數。該標準由美國國家標準與技術研究院(NIST)設立。secp256k1曲線由下述函數定義,該函數可產生一條橢圓曲線:

y2 = (x3 + 7)} over (Fp)

y2 mod p = (x3 + 7) mod p

上述mod p(素數p取模)表明該曲線是在素數階p的有限域內,也寫作Fp,其中p = 2256 – 232 – 29– 28 – 27 – 26 – 24 – 1,這是一個非常大的素數。

因為這條曲線被定義在一個素數階的有限域內,而不是定義在實數範圍,它的函數圖像看起來像分散在兩個維度上的散點圖,因此很難畫圖表示。不過,其中的數學原理與實數範圍的橢圓曲線相似。作為一個例子,下圖顯示了在一個小了很多的素數階17的有限域內的橢圓曲線,其形式為網格上的一系列散點。而secp256k1的比特幣橢圓曲線可以被想象成一個極大的網格上一系列更為複雜的散點。

區塊鏈技術筆記:橢圓曲線密碼學是什麼?

圖為:橢圓曲線密碼學F(p)上的橢圓曲線,其中p = 17

下面舉一個例子,這是secp256k1曲線上的點P,其座標為(x,y)。可以使用Python對其檢驗:

P =(55066263022277343669578718895168534326250603453777594175500187360389116729240,32670510020758816978083085130507043184471273380659243275938904335757337482424)

Python 3.4.0 (default, Mar 30 2014, 19:23:13)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> p = 115792089237316195423570985008687907853269984665640564039457584007908834671663
>>> x = 55066263022277343669578718895168534326250603453777594175500187360389116729240
>>> y = 32670510020758816978083085130507043184471273380659243275938904335757337482424
>>> (x ** 3 + 7 - y**2) % p
0

在橢圓曲線的數學原理中,有一個點被稱為“無窮遠點”,這大致對應於0在加法中的作用。計算機中,它有時表示為X = Y = 0(雖然這不滿足橢圓曲線方程,但可作為特殊情況進行檢驗)。 還有一個 + 運算符,被稱為“加法”,就像小學數學中的實數相加。給定橢圓曲線上的兩個點P1和P2,則橢圓曲線上必定有第三點 P3 = P1 + P2。

幾何圖形中,該第三點P3可以在P1和P2之間畫一條線來確定。這條直線恰好與橢圓曲線上的一點相交。此點記為 P3'=(x,y)。然後,在x軸做映射獲得 P3=(x,-y)。

下面是幾個可以解釋“無窮遠點”之存在需要的特殊情況。 若 P1和 P2是同一點,P1和P2間的連線則為點P1 的切線。曲線上有且只有一個新的點與該切線相交。該切線的斜率可用微分求得。即使限制曲線點為兩個整數座標也可求得斜率!

在某些情況下(即,如果P1和P2具有相同的x值,但不同的y值),則切線會完全垂直,在這種情況下,P3 = “無窮遠點”。

若P1就是“無窮遠點”,那麼其和 P1 + P2= P2。類似地,當P2是無窮遠點,則P1+ P2 = P1。這就是把無窮遠點類似於0的作用。

事實證明,在這裡 + 運算符遵守結合律,這意味著(A+B)C = A(B+C)。這就是說我們可以直接不加括號書寫 A + B + C,而不至於混淆。

至此,我們已經定義了橢圓加法,為擴展加法下面我們對乘法進行標準定義。給定橢圓曲線上的點P,如果k是整數,則 kP = P + P + P + …+ P(k次)。注意,k被有時被混淆而稱為“指數”。


分享到:


相關文章: