ECC 構築安全可靠的區塊鏈

現在很多基於區塊鏈技術的數字貨幣系統,比如:比特幣和以太坊,它們都使用了橢圓曲線密碼學(ECC, Elliptic Curve Cryptography)來保證貨幣的安全性。

ECC 是一種公開密鑰密碼學,又稱為非對稱密碼學。在這種密碼學中,需要產生一對密鑰。其中一個密鑰稱為私鑰,需要保密;另一個密鑰稱為公鑰,是可以公開讓別人知道的。

私鑰和公鑰在數學上的關係是不可逆的,也就是通過某個數學函數,我們可以私鑰計算出公鑰,但是不能從公鑰反向推導出私鑰(或者說從計算上是不可行的)。

非對稱加密演算法

橢圓曲線加密演算法對應的數學函數是橢圓曲線乘法,而另一種廣泛使用的非對稱加密演算法 RSA (由三個發明人姓氏的開頭字母組成)對應的數學函數是極大整數的因式分解。

Advertisements

與對稱密碼學使用相同的密鑰進行加解密不同,非對稱密碼學有一個有用的特性:如果用公鑰對數據進行加密,只有用對應的私鑰才能解密;如果用私鑰對數據進行加密,那麼只有用對應的公鑰才能解密。

橢圓曲線的運算

一聽說橢圓曲線,很多人會憑直覺認為這條數學曲線像個橢圓,其實不然。橢圓曲線因為用二元三次方程y2= x3+ ax + b來表示,類似橢圓周長計算方程而得名。以下是比特幣的橢圓曲線圖,是不是一點也不像橢圓:

橢圓周長方程

橢圓曲線上點的加法定義:任意取橢圓曲線上兩點 A、C (若 A、C 兩點重合,則做 A 點的切線)做直線交於橢圓曲線的另一點 D',過 D'做 y 軸的平行線交於 D。在這裡我們規定 A+C=D。

Advertisements

k 個相同的點 P 相加,我們記作 kP。如下圖:P+P+P = 2P+P = 3P。

如果我們定義K=kG, k 為整數,G 為橢圓曲線上的一個點,該等式就是表示 k 個 G 點相加或 k 乘以G 得到的結果為點 K,K 也為橢圓曲線上的一個點。

我們可以用這個等式中的k 作為私鑰,而結果點K 作為公鑰G 為該橢圓曲線的基點,和參數 a,b 都是公開的

已知整數 k 和基點 G,根據橢圓曲線加法法則,推算出點 K 是非常容易的,因為存在快速演算法可以將計算複雜度降低到O(logk)

私鑰推導出公鑰的過程是不可逆的,即現在數學上還沒有有效的方法可以從基點 G 和點 K 推算出整數 k。如果使用遍曆法來尋找整數 k,其計算複雜度為O(k)。在實際使用時,整數 k 會取一個非常大的值。

比如: k 為一個78位的十進位數,由私鑰推算出公鑰的計算複雜度為O(78),用遍曆法從公鑰找出私鑰的計算複雜度為O(1078),而宇宙中已知的原子總數大概為1080,所以採用暴力破解法破解私鑰是根本不可行的。

區塊鏈中的橢圓曲線: secp256k1

為了讓橢圓曲線更形象易理解,我們上面畫的曲線都是連續的,實際用於加密的曲線都是有限域上定義的離散曲線。

隨著橢圓曲線參數 a、 b,基點 G的不同,橢圓曲線的加密性能也不一樣。為了獲得更高的安全性,對這些參數也有一些特定的要求。

我們會給一些常用的使用特定參數的橢圓曲線取一個名字。比如:美國國家標準與技術研究院(NIST)和美國國家安全局(NSA)推薦過的 secp256r1、secp521r1 等橢圓曲線(有些開源社區懷疑這些曲線中參數有可能被精心選取,導致曲線加密性能弱化),中國國家密碼局認定的 SM2 國產密碼演算法。

比特幣和以太坊使用的橢圓曲線是 secp256k1。該曲線的參數非常簡單(人們相信不是為了設計一條弱曲線而被精心構造的):

( secp256k1 的 a、b 以及基點 G)

ECC 的安全性

與傳統的 RSA 演算法相比,嚴格選定參數的 ECC 有更強的安全性,不易被攻擊。

1)破解相同位數密鑰所需能量:

有科學家通過計算攻破一個密碼學演算法需要多少能量並把它與水沸騰需要多少能量對比來衡量一個加密演算法的安全性。

經過他的分析,破解一個228位的 RSA 密鑰需要的能量少於煮沸一湯勺水的能量。而破解一個228位的橢圓曲線密鑰需要足夠煮沸地球上所有水的能量。

RSA 要達到一個安全的水平,需要一個至少2380位的密鑰。此外RSA 演算法還有一個缺點就是隨著密鑰長度的增加,其安全性的增益是減少的。這意味著我們無法通過不斷增加密鑰長度來獲得更高的安全性。

2)性能對比:

另一方面,使用橢圓曲線簽名演算法(ECDSA)做簽名的性能也比 RSA 簽名演算法高很多。根據某些研究結果,在獲得相同的安全性時,前者要比後者快20多倍。

橢圓曲線加密演算法能夠以更短的密鑰獲取與其他加密演算法相同的安全性及更快的運算速度,所以 ECC 正在快速成為網路隱私和安全的首選解決方案。比特幣等數字貨幣系統也紛紛使用 ECC 作為其安全性的基石。

區塊鏈中的應用

下面我們簡單說說橢圓曲線密碼學在比特幣中的用法。

在比特幣中,用戶生成一個隨機整數 k (256位二進位數)作為其賬戶私鑰,而用對應的公鑰 K(K=kG) 的哈希值作為其賬戶的比特幣地址

(私鑰與地址的關係)

用戶需要使用其賬戶比特幣地址上的貨幣時,只需要提供一個用其私鑰對地址金額等信息計算出的簽名和對應的公鑰。其他比特幣用戶就可以在只知道該用戶公鑰的情況,驗證該簽名是否有效,從而判斷該用戶是否真正擁有該地址上的貨幣。

攻擊者因為無法通過其公鑰或比特幣地址來推算出私鑰,也就無法偽造出一個有效的簽名來盜用其賬戶上的貨幣。

另:在生成私鑰 k 的過程中,確保 k 是真正隨機生成的非常重要。曾經有些廠商的隨機數生成演算法因為有漏洞或者故意留有後門,造成了巨大的安全隱患。

本文作者:肖詩源(點融黑幫),現就職於點融網工程部區塊鏈團隊。華中科技大學博士畢業,在美國國家標準與技術研究院(NIST)做過短期訪問學者,后在愛立信工作10年,獲批8項專利。喜歡旅遊和科幻電影。

本文由@點融黑幫(ID:DianrongMafia)原創發佈於今日頭條,未經許可,禁止轉載。

Advertisements

你可能會喜歡