橢圓曲線密碼學(ECC, Elliptic Curve Cryptography)是基於橢圓曲線數學的一種公鑰加密方法。算法
在諸如 DES
、AES
這類對稱密碼系統中,信息的發送方使用一把密鑰進行加密,接收方使用相同的密鑰進行解密。
而在公鑰加密方法中,信息的加密和解密使用的密鑰是不一樣的,稱之爲公鑰
和私鑰
(注:既能夠公鑰加密私鑰解密,也能夠私鑰加密公鑰解密),經常使用的公鑰加密方法有函數
RSA
- 基於大因數分解ECC
- 基於橢圓曲線和離散對數二者的理論基礎都是數論理論中的單向運算
函數,這種函數有一個特色:正方向計算容易,反方向計算卻十分困難。以RSA背後的因數大數分解理論爲例:
請完成下面的等式:ui
$$ 373 * 751 = ? $$ 加密
若是你有草稿紙和筆 ,會發現這並非很困難,那麼若是是下面因數分解呢?spa
$$ 280123 = ? * ? $$ .net
太困難了 ! 即便是使用計算器,我以爲也沒有誰一時半會兒也算不出來。code
答案是 $373 * 751 = 280123$ ,這就是RSA
的理論基礎,兩個質數(素數)的乘積很容易計算,但要將一個這樣的乘積分解回去就困難了。ECC
採用的與之相似,不一樣的是它採用的是離散對數問題(DLP,Discrete Logarithm Problem)製造單向計算的困難(稍後有例子)。blog
咱們在中學課本里必定都學過橢圓的定義。以下圖所示,ip
橢圓上的點都知足element
$$ ax^2 + by^2= c \quad over \, \mathbb R $$
而密碼學中的橢圓曲線是知足如下等式的點組成的集合,
$$ y^2 \equiv x^3 + ax + b \pmod p \quad x,y \in \Bbb Z_p $$
加上一個想象中的無窮遠點 $\mathscr O$ ,其中$x,y$的取值範圍是 $\Bbb Z_p = \{ 1,2,3...p-1\}$
注:上面的等式須要知足 $ 4a^3 + 27b^2 \neq 0 \pmod p$
舉個栗子
橢圓曲線
$$ E :\quad y^2 ≡ x^3+2x+2 \pmod {17} \quad x,y \in \Bbb Z_{17} $$
包含這些點: $(5,1)$ , $(6,3)$ , $(10,6)$ , $(3,1)$ , $(9,16)$ , $(16,13)$ , $(0,6)$ , $(13,7)$ , $(7,6)$ , $(7,11)$ , $(13,10)$ , $(0,11)$ , $(16,4)$ , $(9,1)$ , $(3,16)$ , $(10,11)$ , $(6,14)$ , $(5,16)$ 以及 $\mathscr O$。上面的點除了 $\mathscr O$之外,它們是下面曲線上的一些離散的點:
注意:顯然從圖像中能夠看出這條曲線是關於 $x$ 軸對稱的,但上面的點的 $y$ 座標都大於0,這是因爲$x,y \in \Bbb Z_{17}$ 。舉例來講點 $(5,1)$ 和 $(5,16)$實際上就是關於$x$軸對稱的。由於 $16\equiv-1 \pmod {17} $,而$(5,-1)$也知足 $ y^2 ≡ x^3+2x+2 \pmod {17} \quad x,y \in \Bbb R $。
.
橢圓曲線上的點構成的集合中只有一種運算,那就是加法
(常數與點的乘法
能夠看作多個加法),兩個點能夠進行加法運算獲得第三個點,注意,這裏的加法
不是簡單的平面座標系橫縱座標的相加(這樣相加的結果獲得的座標頗有可能不在曲線上)。
假設$P=(x_1,y_1)$和$Q=(x_2,y_2)$ 都在曲線上,如何獲得$R=(x_3,y_3)$ 使得
$$ P+Q=R \\ (x_1,y_1)+(x_2,y_2)=(x_3,y_3) $$
咱們從幾何學上定義這種加法
,有兩種狀況:
將 $P$ 和 $Q$ 相連的線段延伸,與橢圓曲線有一個交點,該交點關於$x$軸的對稱點就是所求的$P+Q$
做$P$在橢圓曲線上的切線,這條切線與橢圓曲線有一個交點,該交點關於$x$軸的對稱點就是所求的$2P$
通過一些數學推導,能夠獲得計算$R(x_3,y_3)$座標的公式
$$ x_3 = s^2−x_1−x_2 \pmod p \\ y_3 = s(x_1−x_3)−y_1 \pmod p $$
其中
$$ s = \left\{\begin{matrix} \frac{y_1-y_2}{x_1-x_2} \pmod p ; \quad P \neq Q \\ \frac{3x_{1}^{2} + a}{2y_{1}} \pmod p ; \quad P = Q \end{matrix}\right. $$
還有幾個公式,對於$ P(x_p,y_p)$
$$ P+\mathscr O = P \\ P+(-P) = \mathscr O \\ -P = (x_p , p-y_p ) $$
橢圓曲線上全部點加上$ \mathscr O$ 包含了不少循環子羣(cyclic subgroups) ,其中一個循環子羣就是自身,本文僅考慮這種情形。
循環子羣中的 生成元
(Generator)也被稱做素元(primitive element),經過不斷自加,它能夠「生成」羣衆其餘全部元素。那麼對本文來講,就是橢圓曲線上的一個點$P$,經過不斷自加,它能夠生成橢圓曲線上全部點。
即橢圓曲線上 = $\{ P、2P、3P、....nP\}$,其中$n$爲循環子羣的階。
再以剛纔的例子舉例,
$$ E :\quad y^2 ≡ x^3+2x+2 \pmod {17} \quad x,y \in \Bbb Z_{17} $$
曲線上的全部點就能夠表示爲 $P$ 的倍數
$P=(5,1)\quad 2P=(6,3)\quad3P=(10,6)\quad4P=(3,1)\quad5P=(9,16)\quad6P=(16,13)\quad 7P=(0,6) $
$8P=(13,7)\quad9P=(7,6)\quad10P=(7,11)\quad11P=(13,10)\quad12P=(0,11)\quad13P=(16,4)$
$14P=(9,1)\quad15P=(3,16)\quad16P=(10,11)\quad17P=(6,14)\quad18P=(5,16)\quad19P=\mathscr O$
以前提到過,橢圓曲線密碼系統使用離散對數問題(DLP)
構建公鑰密碼方法,這體現爲如下一個事實:
類比與咱們熟悉的實數域上,指數運算
比對數運算
容易得多
而這裏 $ d $ 就是橢圓曲線密碼系統中的 私鑰
,$ B $ 就是公鑰
,這也就是爲何能夠用私鑰推導出公鑰,反之不行的緣由。
secp256k1
是以太坊中使用的橢圓曲線,其參數能夠點擊Secp256k1 wiki查看,包括橢圓曲線的係數、生成元等。
現實生活中的簽名做用是簽署者對文件進行受權、防止交易中的抵賴發生。
而數字簽名也有這個效果。
Bob將原文$x$用特定Hash函數生成摘要$h$, 用私鑰
加密$h$生成簽名$s$,將原文$x$和摘要$s$一塊兒傳送給Alice。Alice收到後$x'$和$s’$,而後用相同的Hash函數將收到消息$x'$生成摘要$h'$,用Bob的公鑰進行解密獲得簽名$s’$,若是$s = s’$ 則表示消息是完整的,在傳輸過程當中沒有修改。
橢圓曲線數字簽名算法(ECDSA)就是利用橢圓曲線加密方法進行數字簽名的方法。
設咱們使用的曲線
$$ y^2 \equiv x^3 + ax + b \pmod p \quad x,y \in \Bbb Z_p $$ , 其生成元$A$的階數爲$q$,`私鑰`爲$d$,則`公鑰`$B = dA$ ####發送方簽名 1. 選擇一個隨機的key $k_E$,知足$0<k_E<q$ 2. 計算 $R = k_EA$ 3. 令 $r \equiv x_R \pmod p $ ,即 $r$ 爲 $R$ 的 $x$ 座標對 $p$ 求模 4. 計算 $s \equiv (h(x) + d \cdot r)k_E^{-1} \pmod q $ 則生成的 $(r,s)$ 就是數字簽名。以後發送方將 $(s,(r,s))$ 發送給接收方 ####接收方驗證 1. 計算 $u_1 \equiv s^{-1} \cdot h(x) \pmod q $ <sup>`注1`</sup> 2. 計算 $u_2 \equiv s^{-1} \cdot r \pmod q $ 3. 計算 $P = u_1A + u_2B $ 4. 進行驗證 $$ x_P = \left\{ \begin{array}{lr} \equiv r \pmod q \rightarrow 簽名有效 \\ \not\equiv r \pmod q \rightarrow 簽名無效 \end{array} \right. $$
注1
:這裏的$^{-1}$表示在模運算中求逆,在$ \Bbb Z_p$中,一個數 $a$ 與它的逆 $a^{-1}$ 知足 $a \cdot a^{-1} \equiv 1 \pmod p $
由
$$ s \equiv (h(x) + d \cdot r)k_E^{-1} \pmod q $$
兩邊同時乘以 $k_E \cdot s^{-1}$ 可得
$$ k_E \equiv s^{-1}(h(x) + d \cdot r) \pmod q $$
而後
$$ k_E \equiv s^{-1}h(x) + d \cdot s^{-1} \cdot r \pmod q $$
即
$$ k_E \equiv u_1 + u_2d \pmod q $$
同時計算對 生成元$A$的數乘,由 $B = dA$ 有
$$ k_EA = u_1A + u_2B $$
即
$$ R = u_1A + u_2B $$
因此只要接收方計算的 $P$ 的 $x$ 座標等於 $R$ 的 $x$ 座標 $r$ ,則可說明驗證經過 (之因此看 $x$ 座標是由於橢圓曲線中,只憑一個點的 $x$ 座標並不能惟一肯定它的 $y$ 座標)
以曲線 $E: y^2 \equiv x^3 + 2x + 2 \pmod {17} $ 爲例,生成元 $A = (5,1)$
在上面的例子中,Bob 首先須要向 Alice 告知它的公鑰
,但實際上,咱們憑簽名 $(r,s)$ 就恢復出公鑰, 在以太坊中使用 /crypto/secp256k1/secp256.go 中的 RecoverPubkey()
函數完成這一功能。
接收方收到的信息包括原文和簽名: $(x, (r, s))$ ,從 $x$ 能夠計算出 $h(x)$ ,除此以外接收方就只知道橢圓曲線的參數了,如$(a, b, p, q, A)$ ,要注意它不知道 $(d, k_E)$,而咱們的目標是在不知道 $d$ 的狀況下求出 $B$。
由以前推導出的下式開始 $ k_E \equiv s^{-1}h(x) + d \cdot s^{-1} \cdot r \pmod q $
兩邊同時 $A$ 數乘 獲得 $R = s^{-1}h(x)A + s^{-1}B $
表示出$B$ 可得 $B= r^{-1}(sR - h(x)A) $
觀察上式可知,只要知道了 $R$ 點座標,咱們就能夠算出 $B$ ,但咱們沒有 $R$ 點座標, 不過咱們有它的 $x$ 軸座標 $r$ 注2
,咱們能夠將其代入曲線方程,反解出$R$ 點$y$ 座標,但因爲橢圓曲線是關於 $x$ 軸對稱的,因此咱們能夠解出兩個符合條件的 $B$
注2
:咱們這裏忽略 $ r < p - q $ 的情景,這種狀況很罕見(在Secp256k1曲線中,大約是 $2^{-128}$),在這種狀況下 ,有兩個$x_R$都能知足條件。
注意
如下橢圓曲線上的點的計算過程當中
以剛纔的橢圓曲線數字簽名爲例,Alice 收到Bob帶有簽名的消息時,她本身有如下信息 (沒有了Bob的公鑰 $B$ )
計算 $h(x)A = 26*(5,1) = (0,6) $
由 $ r = 7 $ , $ 7 *11 \equiv 1 \pmod {19}$ 獲得 $r^{-1} \equiv 11 \pmod {19} $
再將 $ r = 7 $ ,代入曲線方程,獲得 $R$ 點的座標爲 $(7,6)$ 或 $(7,11)$
$$ sR = 17*(7,6) = (5, 1) $$
因此 $B= r^{-1}(sR - h(x)A) = 11((5,1) - (0,6)) = 11((5,1) + (0,11)) = 11(16, 4) = (7,11) $
$$ sR = 17*(7,11) = (5, 16) $$
因此 $B= r^{-1}(sR - h(x)A) = 11((5,16) - (0,6)) = 11((5,16) + (0,11)) = 11(13, 10) = (0,6) $
最終咱們能夠獲得 兩個符合條件的公鑰
$B = (7,11)$ 和 $B = (0,6)$ , 而不管是哪個均可以得出相同的簽名
[1] Understanding Cryptography, Christof Paar / Jan Pelzl
[2] https://en.bitcoin.it/wiki/Se...