區塊鏈入門 | 橢圓曲線加密的數學原理
比特幣採用了橢圓曲線簽名演算法來簽署交易,這節我們來看看橢圓曲線加密的數學原理,看看在選定了私鑰之後,如何運算出公鑰。
橢圓曲線的點相加定理
首先來聊聊什麼是橢圓曲線,以及橢圓曲線上兩點相加是一個什麼概念。
由方程 y² = x³+ax+b 所描述的曲線就叫做橢圓曲線 ,橢圓曲線相對於 x 軸對稱,隨著 a、b 取值的不同,方程對應不同的曲線。比特幣使用的曲線方程是 y² = x³+7,這條曲線被命名為 secp256k1。
下面就描述一下什麼是橢圓曲線的點相加定理。
若在橢圓曲線上選出兩個點,點相加定理規定了如何得到這兩個點相加的結果。首先我們要把這兩個點用一條直線連線起來,那麼在通常條件下可以得到這條直線與橢圓曲線相交的第三個點。然後再找到第三個點相對 x 軸的對稱點,這個點也在橢圓曲線上,就是之前兩點相加的結果。那麼這個規則就是橢圓曲線的點相加定理。
點相加定理的一種特殊情況是我們只在橢圓曲線上選出一個點 P,如果我們想得到 P+P 的結果,就需要在 P 點做橢圓曲線的切線,這樣在通常條件下也可以得到這條切線和橢圓曲線的另外一個交點,找到這個交點相對 x 軸的對稱點 Q,那麼 Q=P+P=2*P。
這樣點相加定理就介紹完畢。
優化點相加運算過程
已知比特幣的私鑰 x ,要運算公鑰 X,就需要用到點相加定理。具體做法就是選定一個點 P,那麼 X=x*P。x 是一個32位元組的整數,所以很可能是一個非常大的數,但是運算 x*P 的時候我們可以找到優化的點相加的運算過程。
例如,我們要運算 10*P ,直觀上我們會認為要進行9次點相加運算,但是實際上只需要4次,這是因為點相加滿足 n*P+r*P = (n+r)*P 。所以,運算 10*P 的最快方式是分解為下面四步:
P+P = 2*P 2*P+2*P = 4*P 4*P+4*P = 8*P 2*P+8*P=10*P 而對於 x*P,我們可以推匯出這樣的結論,對於任意的私鑰 x,要運算出公鑰 X,最多隻需要進行510步的點相加運算,所以對於計算機來說並不是一個很大的計算任務。比特幣對於 P 的取值是有明確規定的,在 secp256k1 曲線上, P 點的 x 座標 和 y 座標分別為:
x 座標: 55066263022277343669578718895168534326250603453777594175500187360389116729240
y 座標: 32670510020758816978083085130507043184471273380659243275938904335757337482424
x 和 P 以及橢圓曲線確定之後,就可以運算 X 了。X 是橢圓曲線上的一個點,這樣比特幣公鑰就是這個點的 x 和 y 座標值拼接起來的整數。 優化橢圓曲線模型 現在遺留的問題是由於 x 取值的可能性很多,那麼 x*P 得到的點的 x 和 y 值很可能不能被儲存成一個標準的512 bit 的公鑰,所以就要對我們的橢圓曲線模型做一下優化。
優化方案是把橢圓曲線定義在一個有限域內,目的是要確保只有整數點,並且每個點的橫縱座標值都不會過大。具體的規定請檢視文末的參考連結。我們只需要知道模型在優化之後,之前討論的各種操作依然是可行的。
總結
以上介紹了橢圓曲線的加密原理,我們瞭解了從私鑰運算公鑰的基本過程,但是沒有論述二者是不是合格的非對稱加密的祕鑰對,例如,由公鑰是不是很難運算出私鑰,以及論述用私鑰是否可以生成出可以被公鑰驗證的數字簽名。關於這些問題,我們將在下一篇文章中介紹。
參考https://hackernoon.com/what-is-the-math-behind-elliptic-curve-cryptography-f61b25253da3