ECC橢圓曲線以及計算出公鑰的過程(BTC爲例)

ECC概念

全稱 「 Ellipse Curve Cryptography 」  means 「 橢圓 曲線 密碼學 」。html

傳統加密方法大多基於大質數因子分解困難性來實現,ECC則是經過橢圓曲線方程式的性質來產生密鑰。linux

ECC164位的密鑰產生一個安全級,至關於RSA 1024位密鑰提供的保密強度,並且計算量較小,處理速度更快,存儲空間和傳輸帶寬佔用較少。web

應用方面:目前我國居民二代身份證正在使用 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);這是橢圓曲線創建的座標系基礎。ide

例如y^2=x^3-10x+12的曲線以下:函數

數學家在這個曲線上定義了一種橢圓曲線的加法,ECC裏面的加法創建在「有限域上的二元三次曲線的點」上,組成一個「有限加法循環羣」。加密

 

圖a - 兩個不一樣的點相加spa

 

圖b - 兩個相同的點相加3d

 

這並非傳統的數學上的加法,運算法則:任意取橢圓曲線上兩點P、Q (若P、Q兩點重合,則作P點的切線)作直線交於橢圓曲線的另外一點R,過R作y軸的平行線交於R’。

咱們規定P+Q=R’。因此很容易理解nP的值,就是P通過n次加法(對P作切線,取得另外一個交點的關於X軸的對稱點)。

2 這樣定義加法的意義

(1)給使用者求逆向運算(由公鑰計算私鑰)的時候製造困難。
(2)爲了構造一個封閉的「較好的」代數結構,簡化正向運算(由私鑰計算公鑰的運算)。要是單純爲了求解困難,那能夠定義五顏六色的加法,可是加法定義的隨性將致使了運算的複雜。爲了能用一些最基本的運算:好比結合律、好比減法,才這麼定義讓這些點構成一個羣。

3 如何使用這個加法呢

(1)正向計算(由私鑰計算公鑰)
肯定橢圓曲線一個點做爲基點P,因爲全部的點構成一個有限羣,那麼基點P必然能夠做爲一個生成元生成一個子羣。記這個子羣的階數爲n,也就是說P點累加n次獲得羣的單位元(無窮遠點),記作nP=0。(注意此處0只是一個代號,代指無窮遠點,由於咱們習慣了用0來表示加法單位元。)
正向計算的定義很簡單,私鑰爲K\in [0,n); 基點爲點P;公鑰點Q定義爲KP相加(也能夠理解爲乘法):Q=\underset{K}{\widehat{\underbrace{P+P+\cdots +P)}}}
(2)逆向計算(公鑰反推私鑰)有多難:

目前由橢圓曲線公鑰求解私鑰的最有效算法複雜度爲 O(\sqrt{p}),其中 p是階數 n的最大素因子。當參數選的足夠好讓 p>2^{160}時,以目前的計算能力,攻破橢圓曲線是不現實的。
 

4 產生一個公鑰

有了以上的基礎,咱們才能夠來計算公鑰,產生公鑰的算法其實就是橢圓曲線上的乘法運算:

Q = k * P

上面公式中,P 是橢圓曲線上的一個點,且這個點在比特幣中是固定不變的;k 是咱們的私鑰

咱們知道私鑰是一個很大的隨機數;而結果 就是咱們產生的公鑰,根據上面的知識,能夠知道公鑰是 kP 相加的結果,這個結果仍然是橢圓上的一個點 (x,y)

 

比特幣公鑰加密中使用spec256k1 標準(wiki)的橢圓曲線

y^2 \mod{p} = (x^3+7)\mod{p}

  • 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。

 

知足下面公式的全部 (x,y) 座標的集合,就是spec256k1 橢圓曲線:

 實際上橢圓曲線是一個散點圖,並非全部實數字x都知足這個曲線,以P=17爲例子(固然了這個數很小),知足公式的(x,y)的圖形:

p 取不一樣的素數,橢圓曲線會呈現出徹底不一樣的形態, p 越大,這個橢圓也就越大,可承載的數值範圍也就越大,衝突率會下降,乃至於更安全。
所以比特幣中採用的是一個特定的橢圓曲線,稱之爲  spec256k1,它是由 NIST(National Institute of Standards and Technology)這個組織肯定的。
Python玩一玩
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
相關文章
相關標籤/搜索