ECC概念
全稱 “ Ellipse Curve Cryptography ” means “ 橢圓 曲線 密碼學 ”。
傳統加密方法大多基於大質數因子分解困難性來實現,ECC則是通過橢圓曲線方程式的性質來產生密鑰。
ECC164位的密鑰產生一個安全級,相當於RSA 1024位密鑰提供的保密強度,而且計算量較小,處理速度更快,存儲空間和傳輸帶寬占用較少。
應用方面:目前我國居民二代身份證
正在使用 256 位的橢圓曲線密碼,虛擬貨幣比特幣
也選擇ECC作為加密算法。
橢圓曲線的定義以及產生公鑰的過程
1 公式及圖解
假設平面直角坐標系中有點A(x,y),我們定義 X= x/z,Y = y/z,Z=z;那么聯立方程:aX+bY+c1Z =0;
aX+bY+c2Z =0 可以計算出z=0;所以我們新的坐標系中的點可以表示為:(X:Y:0);這是橢圓曲線建立的坐標系基礎。
例如y^2=x^3-10x+12的曲線如下:
數學家在這個曲線上定義了一種橢圓曲線的加法,ECC里面的加法建立在“有限域上的二元三次曲線的點”上,組成一個“有限加法循環群”。
圖a - 兩個不同的點相加
圖b - 兩個相同的點相加
這並不是傳統的數學上的加法,運算法則:任意取橢圓曲線上兩點P、Q (若P、Q兩點重合,則做P點的切線)做直線交於橢圓曲線的另一點R,過R做y軸的平行線交於R’。
我們規定P+Q=R’。所以很容易理解nP的值,就是P經過n次加法(對P做切線,取得另一個交點的關於X軸的對稱點)。
2 這樣定義加法的意義
(2)為了構造一個封閉的“較好的”代數結構,簡化正向運算(由私鑰計算公鑰的運算)。要是單純為了求解困難,那可以定義五光十色的加法,但是加法定義的隨性將導致了運算的復雜。為了能用一些最基本的運算:比如結合律、比如減法,才這么定義讓這些點構成一個群。
3 如何使用這個加法呢
(1)正向計算(由私鑰計算公鑰)正向計算的定義很簡單,私鑰為





目前由橢圓曲線公鑰求解私鑰的最有效算法復雜度為




4 產生一個公鑰
有了以上的基礎,我們才可以來計算公鑰,產生公鑰的算法其實就是橢圓曲線上的乘法運算:
Q = k * P
上面公式中,P 是橢圓曲線上的一個點,且這個點在比特幣中是固定不變的;k 是我們的私鑰,
我們知道私鑰是一個很大的隨機數;而結果 Q 就是我們產生的公鑰,根據上面的知識,可以知道公鑰是 k個 P 相加的結果,這個結果仍然是橢圓上的一個點
比特幣公鑰加密中使用spec256k1 標准(wiki)的橢圓曲線
- mod: 取余符號
- P:一個很大的素數
- x:自變量
- y:因變量
secp256k1標准通過特別的算法,使得生成曲線的速度比別的曲線快30%。這在移動端等小型設備上是非常重要的。
對於比特幣中的橢圓曲線算法,需要明確知道的是(p,a,b,G,n,h)。p是Fp的模的范圍,比特幣中定義的是:
- p = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F = 2^256 − 2^32 − 2^9 − 2^8 − 2^7 − 2^6 − 2^4 − 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 一般取值為01。比特幣中也是01。
滿足下面公式的所有 坐標的集合,就是spec256k1 橢圓曲線:
實際上橢圓曲線是一個散點圖,並不是所有實數字x都滿足這個曲線,以P=17為例子(當然了這個數很小),滿足公式的(x,y)的圖形:


spec256k1
,它是由 NIST(National Institute of Standards and Technology)這個組織確定的。
Python 3.6.7 (default, Oct 23 2018, 11:32:17) [GCC 8.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. # 這里取一個spec256k1的 P 的例子 >>> p = 115792089237316195423570985008687907853269984665640564039457584007908834671663 # P 可以確定一個橢圓,然后再在其中取一個點(x, y) >>> x = 55066263022277343669578718895168534326250603453777594175500187360389116729240 >>> y = 32670510020758816978083085130507043184471273380659243275938904335757337482424 # 驗證 >>> (x**3 + 7) % p - y**2 % p 0
橢圓曲線算法安全性及其現狀運用
目前橢圓曲線應用的范圍越來越廣,在BTC,ETH,EOS,萊特幣,DASH等都有使用。密碼學中把正向計算是很容易的,但若要有效的執行反向則很困難的算法叫做陷門函數。在RSA的內容里,RSA會隨着因式分解的數字變大而變得越有效率,對於私鑰增長的需求決定了RSA並不能算作一個完美的陷門函數。事實證明在橢圓曲線中如果你有兩個點,一個最初的點乘以K次到達最終點,在你只知道最終點時找到n和最初點是很難的,這就是一個非常棒的trapdoor函數的基礎,最近三十年的研究,數學家還沒有找到一個方法證實。密碼學家Lenstra引進了“全球安全(Global Security)”的概念:假設破解一個228字節的RSA秘鑰需要的能量少於煮沸一勺水的能量。那么破解一個228字節的橢圓曲線秘鑰需要煮沸地球上所有水的能量。如果RSA要達到一個同樣的安全水平,你需要一個2,380字節的秘鑰。就像前面文章中講到的,ECC能夠使用較小的資源而產生安全性較高的效果。
筆記參考:
https://www.cnblogs.com/gzhlt/p/10270913.html
https://www.zhihu.com/question/22399196/answer/96016340
https://www.jianshu.com/p/5040d4347c66