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


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 這樣定義加法的意義

(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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM