自己的 愛好 focus 一個數 如果 imp 變化 關註 bre

在目前密碼學的非對稱加密算法中,RSA算法依然是一種主流,但是隨著比特幣中對於一種之前不太流行的算法:橢圓加密算法(ECC)的成功應用後,這種算法得到了很大的關註和普及。有一種說法是中本聰不信任RSA算法,認為美國人在其中留有後門,而據斯諾登的爆料也確實如此。相較RSA,ECC不僅在某種程度上杜絕所謂留有後門的情況,而且加密性能/安全性都有提高。本文就帶大家一窺ECC算法的天地。

鑒於ECC算法對數學知識要求比較高,不像RSA依賴於中學數學的水平,ECC用到了許多《近世代數基礎》,《初等數論》的知識,本文將從一個密碼學愛好者並區塊鏈的角度,講述一下ECC在區塊鏈中的應用。

什麽是橢圓曲線加密(ECC)?

橢圓曲線可以簡單的理解為公式:

技術分享圖片

這是一個數學公式,它的理論基礎要從平行線談起。數學上人們認為的平行線永不相交,這在某種程度上是無法驗證的,因為沒有一個無限遠處的概念,假設平行線在無限遠處相交,這樣的好處是所有的直接都有且只有一個焦點,那麽基於這個事實,我們中學學過的笛卡爾平面直角坐標系可以映射出另外一個平面坐標系:

假設平面直角坐標系中有點A(x,y),我們定義 X= x/z,Y = y/z,Z=z;那麽聯立方程:aX+bY+c1Z =0; aX+bY+c2Z =0 可以計算出z=0;所以我們新的坐標系中的點可以表示為:(X:Y:0);這是橢圓曲線建立的坐標系基礎。

下面在看橢圓曲線的定義:數學把滿足Weierstrass方程的曲線稱為橢圓曲線

這個方程的曲線生成的圖像有很多,基於文章的目的,這裏指介紹形如:y2=x3+ax+b的公式,因為這種情況下的橢圓曲線才適合加密,例如y^2=x^3-10x+12的曲線如下:

技術分享圖片

技術分享圖片

感興趣的讀者可以去https://www.desmos.com/calculator/0mnue7w8lk 模擬一下,通過修改a,b的值觀看曲線變化。需要註意的是並不是所有橢圓曲線都是關於X軸對稱的。讀者可以改變多改變a1的值來發現。

數學家在這個曲線上定義了一種橢圓曲線的加法,在上面定義的公式曲線圖中:

技術分享圖片

技術分享圖片

顯然這並不是傳統的數學上的加法,運算法則:任意取橢圓曲線上兩點P、Q (若P、Q兩點重合,則做P點的切線)做直線交於橢圓曲線的另一點R,過R做y軸的平行線交於R’。我們規定P+Q=R’。所以很容易理解nP的值,就是P經過n次加法(對P做切線,取得另一個交點的關於X軸的對稱點)。

橢圓曲線算法在比特幣中的應用

比特幣公鑰加密中使用的橢圓曲線參數是依照secp256k1標準。在比特幣流行之前很少有人使用過secp256k1,但現在由於它的幾個不錯的屬性越來越受到歡迎。比特幣官網這麽講到:Most commonly-used curves have a random structure, but secp256k1 was constructed in a special non-random way which allows for especially efficient computation. As a result, it is often more than 30% faster than other curves if the implementation is sufficiently optimized。secp256k1標準通過特別的算法,使得生成的曲線比別的曲線快30%。這在移動端等小型設備上是非常重要的。橢圓曲線中還有一個有限域Fp的概念,以素數p為模數的數的集合。它定義橢圓曲線中x,y的範圍,同時它也有自己的加法、乘法、除法、單位元(1),零元(0),並滿足交換率、分配率。列如F23(p的值是23,要求p是素數),它是數據 0到22的集合,關於它的算法:

加法:(18 + 9)mod 23 = 4 減法:(7 - 14) mod 23 = 16 乘法:4 * 7 mod 23 = 5 加法逆元: x + 5 = 0 mod 23 => x= 18 乘法逆元: x *9 = 1 mod 23 => x= 18 。

所以對於比特幣中的橢圓曲線算法,需要明確知道的是(p,a,b,G,n,h)。p是Fp的模的範圍,比特幣中定義的是:

  • p = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F

  • = 2256 - 232 - 29 - 28 - 27 - 26 - 24 - 1。a,b是橢圓曲線的參數,分別是a=0,b=7。G是基點,可以理解為橢圓曲線中第一個點,列如前面的P。比特幣中定義的點G 為 (02 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798,483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8)。n 是基點G的可倍積階數,定義為能夠使得點倍積nG 不存在的最小的整數n,比特幣中它的值為:FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141。h是一個整數常量,它跟橢圓曲線運算中得到點的集合以及 n 有關,h 一般取值為1。比特幣中也是1。

    比特幣中的橢圓曲線如下:技術分享圖片

  • 技術分享圖片

加密流程:以一個隨機生成的私鑰k為起點,我們將其與曲線上預定的生成點G相乘以獲得曲線上的另一點,也就是相應的公鑰 K。生成點是secp256k1標準的一部分,比特幣密鑰的生成點都是相同的:{K = k * G}。

這就是比特幣中秘鑰的生成過程,也就是比特幣中安全性依賴的根本。

橢圓曲線算法安全性,現狀,運用

目前橢圓曲線應用的範圍越來越廣,在BTC,ETH,EOS,萊特幣,DASH等都有使用。密碼學中把正向計算是很容易的,但若要有效的執行反向則很困難的算法叫做陷門函數。在RSA的章節中已經介紹過,RSA會隨著因式分解的數字變大而變得越有效率,對於私鑰增長的需求決定了RSA並不能算作一個完美的陷門函數。事實證明在橢圓曲線中如果你有兩個點,一個最初的點乘以K次到達最終點,在你只知道最終點時找到n和最初點是很難的,這就是一個非常棒的trapdoor函數的基礎,最近三十年的研究,數學家還沒有找到一個方法證實。密碼學家Lenstra引進了“全球安全(Global Security)”的概念:假設破解一個228字節的RSA秘鑰需要的能量少於煮沸一勺水的能量。那麽破解一個228字節的橢圓曲線秘鑰需要煮沸地球上所有水的能量。如果RSA要達到一個同樣的安全水平,你需要一個2,380字節的秘鑰。就像前面文章中講到的,ECC能夠使用較小的資源而產生安全性較高的效果。

區塊鏈中的密碼學(三)-橢圓曲線加密算法分析