橢圓曲線加密演算法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操作介面簡單,基本...