深入區塊鏈以太坊原始碼之橢圓曲線演算法

2021-08-31 13:41:13 字數 4364 閱讀 7510

橢圓曲線加密演算法elliptic curve cryptosystem

安全性基礎:橢圓曲線群上的離散對數問題。目前,最好解決演算法仍是指數時間。

一、橢圓曲線群是由兩部分組成:

第一部分是m。區域f中有兩個數a,b

m = y^2  = x^3 + ax + b  其中x,y屬於f*f

第二部分為o點(無窮遠點)

(橢圓曲線群)e = o u m

知道了橢圓曲線群的定義之後,根據引數的不同其在座標軸上的影象必定是不同的,有的

關於x軸是對稱的,有的不對稱。為了方便研究可以取關於x軸堆成的橢圓曲線:

y^2 = x^3 - x。所表示的影象就是左邊是乙個橢圓曲線,右邊是乙個類似小於號的半開口形狀

二、橢圓曲線上的加法(幾何的表示方法)

根據曲線上兩點的選擇可以分為以下三種情況:

1. 當選擇的兩個不相同點(這裡選擇的兩點一般為類似橢圓上的兩點),

且兩點的連線不是和y軸平行。那麼延長線段必定和曲線上另乙個點相交為p,

這個相交的點p做與y軸平行的線交於橢圓上另一點p',p'這個點就是兩點相加的結果

2.如果選擇的點相同,則作此點在橢圓上的切線,又會交於一點(剩餘步驟同1.)

3.若兩點相連的延長線和y軸平行,那麼兩點的加和就是無窮遠點o

橢圓曲線上的加法(數學上的描述方法)

(1)p + o = o + p = p (p屬於e,o為無窮遠點,這裡的無窮遠點類似於零)

(2)p=(x1,y1) ,q = (x2,y2) 屬於e

1.o 若 x1 = x2 且 y1 = -y2

p + q = 

2.(x3,y3) 其他

其中/ x3 = t^2-x1-x2              / 1.(y2-y1)/(x2-x1) 若p!=q (點加運算)

點r=                               且 t = 

\ y3 = t(x1-x3)-y1           \    2.(3*x1^2+a) / (2y1) 若p = q (倍乘運算)

因此(x3,y3)有三種結果。

我們試著證明為什麼會有這三種結果呢?

a .討論並證明t的取值

p=(x1,y1) ,q = (x2,y2) 屬於e

1.當p != q時,兩點斜率為t = (y2-y1)/(x2-x1) 

2.當p = q,在p(q)點的導數就是t = dy/dx

對等式y^2 = x^3 + ax + b兩邊關於x求導得到:

2y*(dy/dx) = 3x^2 + a

以及t = (dy/dx) = (3*x1^2+a) / (2y1)

b.證明直線y = tx + c與橢圓曲線y^2 = x^3 + ax + b的第三個交點

所以可以聯立上面兩個方程得到乙個關於t和x的方程得:

x^3-t^2*x+(a+2tc)*x+b-c^2 = 0

設r'=(x3,-y3)是pq之外的第三個點。可得:x1+x2+x3 = t^2

這裡可以求得x3的值,再帶入直線方程可得到y3的值y3取負得到最終的值

練習:設p=23,f=z mod p 橢圓方程y^2 = x^3+x+4 p(4,7) ,q(13,11)

點加運算:p+q = (15,6)   倍乘運算:2p(10,18)

我們可以看看點加運算的x3,y3是怎麼得到的:

根據斜率公式我們可以簡單的得到t = 4/9,

同時過兩點的直線方程為:y = (4/9)x-2

根據公式x1+x2+x3 = t^2

x3 = (4/9)^2 - 4-13 = ? (mod 23)

但真正在橢圓曲線上求解t(這裡是4/9)時會使用逆元而並非直接運算,

因為現實情況中分子分母可能會非常大不能直接運算,而往往這種情況下

都允許取模來控制結果的範圍。但除法不能取模,而乘法可以取模。那麼

逆元就派上用場了。

若對於數字a,c 存在x,使a * x = 1 (mod c) ,那麼稱x為 a 對c的乘法逆元。

回歸上述問題x3 = (4/9)^2 - 4-13 = ? (mod 23)如何用逆元求解問題?

根據逆元形式我們整理上式 16/81  mod 23 = (17+?) 

對於(81,23) x * 81 = 1 mod 23 得到x = 2

那麼(16/81) * (2*81) = (17+?) mod 23

結果得到?= 15即為x3的值  

求解乙個整數k,使得在橢圓曲線e上的兩個點a,b

滿足k*a = b,這就稱之為橢圓曲線群e上的離散對數問題,但是

這個問題和np問題一樣是數學困難問題

三、橢圓曲線的數字簽名

數字簽名應該滿足的條件:

1、簽名與檔案是不可分割的整體。

2、簽名者不能否認自己的簽名。

3、接受者能驗證簽名,任何人都不能偽造簽名。

4、雙方發生爭執,有可信第三方解決問題。

數字簽名方案的分類:

1.利用特殊的公鑰加密演算法實現。並且所有的公鑰加密演算法都能實現數字簽名。

只有滿足d(e(x)) = e(d(x)) = x(e為加密,d為脫密)的公鑰密碼演算法才能實現數字簽名。

2.利用專門設計的數字簽名演算法。

基於公鑰演算法設計的數字簽名

使用者a對檔案m簽名過程:

(1)利用簽名金鑰kd對m進行脫密變換d,得到sign(m) = d(m)

(2)簽名者將檔案m和簽名sign(m)一起公布

使用者b對簽名驗證過程:

利用使用者a的簽名識別秘鑰ke對簽名sign(m)執行加密變換e,即e(sign(m))

如果結果和m相同則是使用者a對m的簽名,否則不是。(因為e(d()) = d(e()))

ecdsa簽名的過程是:

假設alice要給bob發乙個經過數字簽名的訊息,他們首先需要定義一組共同接受的橢圓曲線加密用引數,

簡單的,這組引數可表示為(curve, g, n)其中,curve表示橢圓曲線點域和幾何方程;g是所有點倍積運算的基點;

n是該橢圓曲線的可倍積階數(multiplicative order),作為乙個很大的質數,n的幾何意義在於,ng = 0,

即點倍積ng的結果不存在,而對於小於n的任何乙個正整數 m = [1,n-1],

點倍積mg都可以得到乙個合理的處於該橢圓曲線上的點。

其次,alice要建立一對鑰,即乙個私鑰和乙個公鑰。

私鑰來自於[1, n-1]範圍內乙個隨機數:da = rand(1,n-1)

公鑰如下,它來自私鑰和基點的橢圓曲線點倍積:

qa = da * g

假設alice想要對訊息m作數字簽名,有以下步驟:

1.計算 e = hash(m),hash是乙個雜湊加密函式,比如sha-2,或sha-3。

2.計算 z,來自e的二進位制形式下最左邊(即最高位)l_n個bits,

而l_n是上述橢圓曲線引數中的可倍積階數n的二進位制長度。注意z 可能大於n,但長度絕對不會比 n 更長。

3.從 [1, n-1] 內,隨機選擇乙個符合加密學隨機安全性的整數k。

4.計算乙個橢圓曲線上點:

(x1,y1) = k * g

5.以下式計算 r 值, 如果r == 0, 則返回步驟3重新計算。

r = x1 % n

6.以下式計算 s 值,如果 s == 0,則返回步驟3重新計算。

s = k^(-1) * (z + r*da) % n

生成的數字簽名就是 (r, s)

特別需要注意的是步驟3中 k 的選擇,它不僅要滿足加密學的隨機安全性要求,

要像私鑰一樣保護起來,更重要的是,在每次生成乙個新的數字簽名時,這個 k 必須每次都要更新

驗證ecdsa簽名的過程:

收到數字簽名檔案外,還會有乙份公鑰。所以bob的驗證分兩部分,首先驗證公鑰,

然後驗證簽名檔案(r, s)。

一、公鑰驗證

1.通過公鑰的座標qa驗證它必須是處於該橢圓曲線上的點。

2.曲線的可倍積階數 n 與公鑰的點倍積不存在。n×qa=o

二、簽名檔案的驗證

1、驗證r和s均是處於[1, n-1]範圍內的整型數;否則驗證失敗

2、計算e=hash(n),hahs()即簽名生成過程步驟1中使用的雜湊函式。

3、計算z,來自e的最左邊l_n個bits。

4、計算引數w:

w=s^(-1) mod n

5、計算兩個引數u1和u2:

u1=zw mod n ,u2=rw mod n

6、計算(x1, y1),如果(x1, y1)不是乙個橢圓曲線上的點,則驗證失敗:

(x1, y1) =u1×g + u2×qa

7、如果以下恒等式不成立,則驗證失敗:

r≡(x1mod n)

以上就是橢圓曲線數字簽名演算法(ecdsa)的生成和驗證的完整過程。

區塊鏈之以太坊學習

區塊鏈通常被定義為去中心的分布式記賬系統,該系統中的節點無需互相信任,通過統一的共識機制共同維護乙份賬本。在前幾年,大家會關注位元幣而不會單獨談論區塊鏈這個技術。直到2015年,區塊鏈這一概念才被單獨提出來為更多人所了解,且向著更廣泛的應用場景發展。發生在這個時間點的主要原因之一是以太坊的出現和日益...

區塊鏈之發行以太坊 Token

以太坊 英文 ethereum 是乙個開源的有智慧型合約功能的公共區塊鏈平台,通過其專用加密貨幣以太幣 ether,簡稱 eth 提供去中心化的以太虛擬機器 ethereum virtual machine 來處理點對點合約。以太坊的概念首次在 2013 至 2014 年間由程式設計師 vitali...

以太坊原始碼之 資料持久化

leveldb是乙個持久化儲存的kv系統,與redis相比,leveldb是將大部分資料儲存到磁碟中。而redis是乙個記憶體型的kv儲存系統,會吃記憶體。leveldb在儲存資料時,是有序儲存的,也就是相鄰的key值在儲存檔案中是按照順序儲存的 與其它kv系統一樣,leveldb操作介面簡單,基本...