比特幣ecdsa演算法python
⑴ 比特幣的原理嗎
首先你要知道公鑰和私鑰的概念
2.比特幣主要用了ECDSA,也就是橢圓曲線簽名演算法,這個演算法有兩個特性,注意這兩點對下面至關重要
3.比特幣其實沒有錢包,只有交易賬單,整個比特幣就是交易賬單
4.比特幣的賬戶,就是一段公鑰
⑵ 比特幣錢包地址是如何得到的不是比特幣地址而是錢包地址!
首先,你應該在大腦中想像出一個「錢包」的概念。你的bitcoin都放在你的「錢包」中一個錢包可以包含很多很多......很多個地址。地址的形式就是形如。
利用比特幣錢包中生成的比特幣地址你可以接收來自他人的比特幣,你也可以將你帳戶上的比特幣轉到他人的比特幣地址上面。比特幣地址就像銀行卡號一樣,具有支付、轉賬、提現功能,但在轉賬時,你只有知道別人的比特幣地址才能進行比特幣轉賬。
如果我們把比特幣錢包簡單比作成銀行卡賬戶的話,那麼比特幣錢包地址就可以看成是銀行卡賬號。不同的是,比特幣地址是可以不存儲在網路上的,更是可以獨立於你的錢包而存在的。
(2)比特幣ecdsa演算法python擴展閱讀:
比特幣地址是一串由 26位到34位字母和數字字元串組成的。 看上去像一堆亂碼一樣,說白了這個就像你的銀行卡卡號一樣。 通過區塊鏈查可以查每個比特幣地址的所有轉賬記錄,公開透明。
比特幣錢包地址生成:通過隨機選出256位二進制數字,形成私鑰,然後通過加密函數來生成地址。這個生成方向是單向的。也就是你知道了地址是無法通過解密方法來計算出私鑰的。就目前的人類計算機運算能力無法破解,你可以很放心地把地址公布到網上。
參考鏈接:比特幣|網路
⑶ python怎麼安裝ecdsa
貌似缺少依握渣好賴包。 先安裝個python-pip 然後用pip install beautifulsoup 自段鉛動搞梁做定依賴。
⑷ 3、數字簽名(ECDSA)
比特幣中使用的數字簽名演算法是橢圓曲線數字簽名演算法(Elliptic Curve Digital Signature Algorithm)或ECDSA。 ECDSA是用於基於橢圓曲線私鑰/公鑰對的數字簽名的演算法,如橢圓曲線章節[elliptic_curve]所述。 ECDSA用於腳本函數OP_CHECKSIG,OP_CHECKSIGVERIFY,OP_CHECKMULTISIG和OP_CHECKMULTISIGVERIFY。每當你鎖定腳本中看到這些時,解鎖腳本都必須包含一個ECDSA簽名。
數字簽名在比特幣中有三種慎拿高用途:
● 第一,簽名證明私鑰的所有者,即資金所有者,已經授權支出這些資金。
● 第二,授權證明是不可否認的(不可否認性)。
● 第三,簽名證明交易(或交易的具體部分)在簽字之後沒有也不能被任何人修改。
創建數字簽名
在比特幣的ECDSA演算法的實現中,被簽名的「消息」是交易,或更確切地說是交易中特定數據子集的哈希值(參見簽名哈希類型(SIGHASH))。
簽名密鑰是用戶的私鑰,結果是簽名:
((Sig = F{sig}(F{hash}(m), dA)))
這里的:
● dA 是簽名私鑰
● m 是交易(或其部分)
● F hash 是散列函數
● F sig 是簽名演算法
● Sig 是結果簽名
ECDSA數學運算的更多細節可以在ECDSA Math章節中找到。
函數F sig 產生由兩個值組成的簽名Sig,通常稱寬尺為R和S:
Sig = (R, S)
簽名序列化(DER)
解鎖腳本序列化之後:
1301
包含敏嫌以下9個元素:
● 0x30表示DER序列的開始
● 0x45 - 序列的長度(69位元組)
● 0x02 - 一個整數值
● 0x21 - 整數的長度(33位元組)
● R-
● 0x02 - 接下來是一個整數
● 0x20 - 整數的長度(32位元組)
● S-
● 後綴(0x01)指示使用的哈希的類型(SIGHASH_ALL)
⑸ 理解橢圓曲線加密演算法
橢圓曲線加密演算法,即:Elliptic Curve Cryptography,簡稱ECC,是基於橢圓曲線數學理論實現的一種非對稱加密演算法。相比RSA,ECC優勢是可以使用更短的密鑰,來實現與RSA相當或更高的安全。據研究,160位ECC加密安全性相當於1024位RSA加密,210位ECC加密安全性相當於2048位RSA加密。
一般橢圓曲線方程式表示為:(其中a,b,c,d為系數)
> y2=ax3+ bx2+cx+d
典型的橢圓曲線如:y2=x3−4x2+16
先擺一個栗子:
小米很難算到的那個數,就是公鑰密碼演算法中的私鑰(一個公鑰密碼演算法安全的必要條件(非充分)是「由公鑰不能反推出私鑰」),公鑰密碼演算法最根本的原理是利用信息的不對稱性:即掌握私鑰的人在整個通信過程中掌握最多的信息。
橢圓曲線加密演算法是一個基於加法階數難求問題的密碼方案。 對於橢圓曲線來講,橢圓曲線的基點就是例子裡面的5,而私鑰就是基點的加法階數(例子裡面的11),公鑰是基點(5)進行對應階數的加法(11次)得到的結果(55)。
簡單描述就是:G * k = K (G,K公開,k保密)
上述例子相對簡單,橢圓曲線加密演算法里的加法建立在 「有限域上的二元三次曲線上的點」上 ,組成一個「有限加法循環群」。具體的說,這個加法的幾何定義如下圖,兩個點的加法結果是指這兩點的連線和曲線的交點關於x軸的鏡像。
如果我們從某一點出發(所謂的單位元,比如正整數域的1,代表一個空間里的最基本單元),不停做自增操作(所謂群操作,比如++),枚舉出整個空間的集合元素。如圖:
因此給定橢圓曲線的某一點G,從G出發,不停做切線,找對稱點,依次得到-2G,2G,-4G,4G,-8G,8G... 。即:當給定G點時,已知x,求xG點並不困難。反之,已知xG點,求x則非常困難。即Q = NG,N就是我們的私鑰,Q就是我們的公鑰。
現在我們知道了公鑰(Q)和私鑰(N)的生成的原理,我們在看看橢圓曲線數字簽名演算法(ECDSA)的過程,橢圓曲線數字簽名演算法(ECDSA)是使用橢圓曲線密碼(ECC)對數字簽名演算法(DSA)的模擬。ECDSA於1999年成為ANSI標准,並於2000年成為IEEE和NIST標准。
私鑰主要用於 簽名,解密 ;公鑰主要用於 驗簽,加密 ,可以通過私鑰可以計算出公鑰,反之則不行。
公鑰加密:公鑰加密的內容可以用私鑰來解密——只有私鑰持有者才能解密。
私鑰簽名:私鑰簽名的內容可以用公鑰驗證。公鑰能驗證的簽名均可視為私鑰持有人所簽署。
通常需要六個參數來描敘一個特定的橢圓曲線:T = (p, a, b, G, n, h).
p: 代表有限域Fp的那個質數 a,b:橢圓方程的參數 G: 橢圓曲線上的一個基點G = (xG, yG) n:G在Fp中規定的序號,一個質數。 h:余因數(cofactor),控制選取點的密度。h = #E(Fp) / n。
這里以secp256k1曲線(比特幣簽名所使用的曲線)為例介紹一下公私鑰對的產生的過成。
secp256k1的參數為:
本質上ECDSA的私鑰就是一個隨機數滿足在曲線G的n階里及k∈(0,n),根據Q=kG可以計算出公鑰,生成的私鑰一般為32位元組大小,公鑰通常為64個位元組大小。如:
ECDSA簽名演算法的輸入是數據的哈希值,而不是數據的本身,我們假設用戶的密鑰對:(d, Q);(d為私鑰,Q為公鑰) 待簽名的信息:M; e = Hash(M);簽名:Signature(e) = ( r, s)。
簽名介面:
驗證介面:
一個例子:
⑹ ECDSA的最簡理解
y^2 = (x^3 + a * x + b) mod p
上述的曲線是在整數,一定bit數量(假設是160bit)內可以表達的,p是 160bits內可以表示的大整數。
為什麼是這種曲線定義呢,我個人覺得有3個原因:
在橢圓曲線上隨意取兩個點 A,B,連接A,B兩個點的直線與曲線的新的交點稱為C,C關於X對稱的-C點表示為 A+B。
乘法可以用加法表示,但是演算法復雜堵是 log(n)。
其實為什麼選擇上述的橢圓曲線實際上是由這個加法規則選出來的,總是要求解這個新的交點更加簡單。
R=k*P 的性質,已知R與P的值,無法推出k的值, 而知道k值於P值是很容易計算R值(log(n))。這是ECDSA簽名演算法的理論基礎。
如何利用這個門限函數來做一個簽名演算法呢?
一個順理成章的想法是: 給驗證人一個 R和P,那隻有簽名人才能提供K,那K是不是老掘亂可以作為一個簽名指紋呢?
ok,咱先生成一個公私鑰對, Qa = dA * G , Qa 就是公鑰, dA 是一個隨機數,就當是一個私鑰吧,當然這個橢圓曲線的 a , b , p , G 值都是要公開的。這個 G 就是橢圓曲線上隨機挑選的一個節點,我們叫原點,也是要公開的。
每次對一個數據做簽名,都隨機生成一個隨機數 K 吧, P = K * G 。咱們把 P的x軸坐標R作為簽名的一部分。另一部分簽名數據叫 S 。侍檔
顯然這個 S 既要和 dA 相關,也要和被簽名的信息 z 相關。我們就假定:
S = Sig(dA, G, z, R, K) , 那這個函數就是簽名函數。
而驗證函數應該只有 S,R ,而不會有 K,dA
P = h(S, G, z, R) , h 就是簽名函數。
密碼學專家想到了一個實現:
S = k^-1 (z + dA * R) mod p
k^-1 表示的是關於p的模逆元。( k^-1 * k mod p = 1)。
可以推倒初驗證函數:
==> k = S^-1 (z + dA * R) mod p
==> k*G = S^-1 (z + dA * R) *G
==> P = S^-1*z*G + S^-1*dA*R*G
==> P = S^-1*z*G + S^-1*R*Qa
對於驗證者來說,需要計算: S^-1*z*G + S^-1*R*Qa 的x坐標是否就是 R 。
go的橢圓曲線 a 為固定的-3, 而 b 可以自由的選擇,而p224, p256曲線的其實指的是 曲線的bit位數是224和256。
演算法實現著為了更加快速散殲地執行曲線上的加法和乘法,對笛卡爾坐標做了投射成(x,y,z)的雅各布坐標,投射關系:
可以加速在雅各布坐標繫上的運算,在需要最終結果的時候再投射回笛卡爾坐標系。
一個曲線的表示:
公私鑰對的表示:
可以看出曲線,公鑰,私鑰擁有的信息越來越全。
公鑰是 曲線信息+ dA*G的信息。
私鑰是 公鑰信息 + dA信息。
美國國安局發布的曲線其實是 secp256k1 , 對於其參數其實沒有很好的解釋,大家猜測是國安局找到了這是一條弱化的橢圓曲線,因此BTC在設計之初也沒有採用這個曲線,而是用了 Koblitz Curve , b 是7, a 是0,btcsuit的package中,對 KoblitzCurve 是golang的 curvparam 的一層封裝(主要是為了加速),但是有更多的參數, 是因為a和b等參數都是預先設定的,增加更多的參數來加速計算。至於公私方法和golang基本一樣。
Ed25519 從某種意義上來說也屬於橢圓曲線密碼學,不同的是它採用扭曲愛德華茲曲線作為橢圓曲線,同時採用的簽名機制也不同於 ECDSA 演算法。EdDSA 的重要實現 ED25519 是 Daniel J. Bernstein 等人設計的 EdDSA 演算法,採用的曲線參數完全公開,並說明了參數選取的意義,保證曲線中並未內置後門。
曲線:
y^2 = (x^3 + x^2 + {一個很大的隨機數}x ) mod p
他生成公私鑰的流程有一些區別,seed作為私鑰,seed計算出的hash值去和G相乘得到公鑰,為了防止多次計算,把這部分公鑰擴展到私鑰的後面作為一個完整的私鑰。計算簽名的時候,普通ecdsa會生成一個隨機數K,而ec25519為了避免偽隨機數被猜測到,因此是私鑰和msg的hash值作為這個隨機數。
⑺ 我了解到生成比特幣地址的十個步驟, 求問:第一步生成私鑰是隨機生成呢,還是根據你的比特幣數量信息
礦工你好
⑻ 比特幣基礎知識 你絕對想不到
橢圓曲線數字簽名演算法
橢圓曲線數字簽名演算法(ECDSA)是使用橢圓曲線對數字簽名演算法(DSA)的模擬,該演算法是構成比特幣系統的基石。
私鑰
非公開,擁有者需安全保管。通常是由隨機演算法生成的,說白了,就是一個巨大的隨機整數,32位元組,256位。
大小介於1 ~ 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4141之間的數,都可以認為是一個合法的私鑰。
於是,除了隨機方法外,採用特定演算法由固定的輸入,得到32位元組輸出的演算法就可以成為得到私鑰的方法。於是,便有了迷你私鑰(Mini Privkey),原理很簡單,例如,採用SHA256的一種實現:
private key = SHA256()1
迷你私鑰存在安全問題,因為輸入集合太小,易被構造常見組合的彩虹表暴力破解,所以通常仿輪納還是使用系統隨機生成的比較好,無安全隱患。
公鑰
公鑰與私鑰是相對應的,一把私鑰可以推出唯一的公鑰,但公鑰卻無法推導出私鑰。公鑰有兩種形式:壓縮與非壓縮。
早期比特幣均使用非壓縮公鑰,現大部分客戶端已默認使用壓縮公鑰。
這個貌似是比特幣系統一個長得像feature的bug,早期人少活多代碼寫得不夠精細,openssl庫的文檔又不足夠好,導致Satoshi以為必須使用非壓縮的完整公鑰,後來大家發現其實公鑰的左右兩個32位元組是有關聯的,左側(X)可以推出右側(Y)的平方值,有左側(X)就可以了。
現在系統里兩種方式共存,應該會一直共存下去。兩種公鑰的首個位元組為標識位,壓縮為33位元組,非壓縮為65位元組。以0x04開頭為非壓縮,0x02/0x03開頭為壓縮公鑰,0x02/0x03的選取由右側Y開方後的奇偶決定。
壓縮形式可以減小Tx/Block的體積,每個Tx Input減少32位元組。
簽名
使用私鑰對數據進行簽署(Sign)會得到簽名(Signature)。通常會將數據先生成Hash值,然後對此Hash值進行簽名。簽名(signature)有兩部分組成: R + S。由簽名(signature)與Hash值,便可以推出一個公鑰,驗證此公鑰,便可知道此簽名是否由公鑰對應的私鑰簽名。
通常,每個簽名會有三個長度:73、72、71,符合校驗的概率為25%、50%、25%。所以每次簽署後,需要找出符合校驗的簽名長度,再提供給驗證方。
地址
地址是為了人們交換方便而弄出來的一個方案,因為公鑰太長了(130字元串或66字元串)。地址長度為25位元組,轉為base58編碼後,為34或35個字元。base58是類似base64的編碼,但去掉了易引起視覺混淆的字元,又在地址末尾添加了4個位元組校驗位,保障在人們交換個別字元錯誤時,也能夠因地址校驗失敗而制止了誤操作。
由於存在公鑰有兩種形式,那麼一個公鑰便對應兩個地址。這兩個地址都可由同一私鑰簽署交易。
公鑰生成地址的演算法:
Version = 1 byte of 0 (zero); on the test network, this is 1 byte of 111
Key hash = Version concatenated with RIPEMD-160(SHA-256(public key))
Checksum = 1st 4 bytes of SHA-256(SHA-256(Key hash))
Bitcoin Address = Base58Encode(Key hash concatenated with Checksum)1234
下圖是非壓縮公鑰生成地址的過程:
對於壓縮公鑰生成地址時,則只取公鑰的X部分即可。
推導關系
三者推導關系:私鑰
公鑰
兩個地址。過程均不可逆。擁有私鑰便擁有一切,但通常為了方便,會把對應的公鑰、地址也存儲起來。
交易
比特幣的交易(Transation,縮寫Tx),並不是通常意義的桐散交易,例如一手交錢一手交貨,而是轉賬。交易由N個輸入和M個輸出兩部分組成。交易的每個輸入便是前向交易的某個輸出,那麼追蹤到源頭,必然出現一個沒有輸入的交易,此類交易稱為CoinBase Tx。CoinBase類備沒交易是獎勵挖礦者而產生的交易,該交易總是位於Block塊的第一筆。
擁有一個輸入與輸出的Tx數據:
Input:
Previous tx:
Index: 0
scriptSig:
241501
Output:
Value: 5000000000
scriptPubKey: OP_DUP OP_HASH160
OP_EQUALVERIFY OP_CHECKSIG12345678910
一旦某個Tx的第N個輸出成為另一個Tx的輸入,那麼該筆比特幣即為已花費。每個交易有唯一Hash字元串來標識,通過對交易數據做兩次SHA256哈希運算而來:
Tx Hash ID = SHA256(SHA256(Tx Data))1
礦工費
礦工費(Transaction Fee)是鼓勵礦工將Tx打包進Block的激勵報酬。計算一筆交易的礦工費:
Transaction Fee = SUM(Inputs amount) - SUM(Outputs amount)1
每筆Tx的礦工費必然大於等於零,否則該筆Tx即為非法,不會被網路接收。
數據塊
數據塊(Block)是存儲Block Meta與Tx的地方。Block的第一筆Tx總是CoinBase Tx,因此Block中的交易數量總是大於等於1,隨後是這段時間內網路廣播出來的Tx。
找到合適的Block是一件非常困難的事情,需要通過大量的數學計算才能發現,該計算過程稱為「挖礦」。首個發現者,會得到一些比特幣作為獎勵。
數據鏈
多個Block連接起來成為數據鏈(Block Chain)。
為了引入容錯與競爭機制,比特幣系統允許Block Chain出現分叉,但每個節點總是傾向於選擇最高的、難度最大的鏈,並稱之為Best Chain,節點只認可Best Chain上的數據。
首個Block稱為Genesis Block,並設定高度為零,後續每新增一個Block,高度則遞增一。目前是不允許花費Genesis Block中的比特幣的。
每個Block中的Tx在此Block中均唯一
一個Tx通常只會在一個Block里,也可能會出現在多個Block中,但只會在Best Chain中的某一個Block出現一次
貨幣存儲
比特幣是密碼貨幣、純數字化貨幣,沒有看得見摸得著的硬幣或紙幣。一個人持有比特幣意味著:
其擁有一些地址的私鑰
這些地址是數筆交易的輸出,且未花費
所有貨幣記錄均以交易形式存儲在整個blockchain數據塊中,無交易無貨幣。貨幣不會憑空產生,也不會憑空消失。遺失了某個地址的私鑰,意味著該地址上的Tx無法簽署,無法成為下一個Tx的輸入,便認為該筆比特幣永久消失了。
貨幣發行
既然所有交易的輸入源頭都是來自CoinBase,產生CoinBase時即意味著貨幣發行。比特幣採用衰減發行,每四年產量減半,第一個四年每個block的coinbase獎勵50BTC,隨後是25btc, 12.5btc, 並最終於2140年為零,此時總量達到極限為2100萬個btc。
減半周期,嚴格來說,並不是准確的四年,而是每生成210000個block。之所以俗稱四年減半,是因為比特幣系統會根據全網算力的大小自動調整難度系統,使得大約每兩周產生2016個block,那麼四年約21萬塊block。
該函數GetBlockValue()用於計算挖得Block的獎勵值:
int64 static GetBlockValue(int nHeight, int64 nFees)
{
int64 nSubsidy = 50 * COIN;
// Subsidy is cut in half every 210000 blocks, which will occur approximately every 4 years
nSubsidy = (nHeight / 210000);
return nSubsidy + nFees;
}123456789
當達到2100萬btc以後,不再有來自CoinBase的獎勵了,礦工的收入來源僅剩下交易的礦工費。此時,每個block的收入絕對值btc很低,但此時比特幣應當會非常繁榮,幣值也會相當的高,使得礦工們依然有利可圖。
杜絕多重支付
傳統貨幣存在多重支付(Double Spending)問題,典型的比如非數字時代的支票詐騙、數字時代的信用卡詐騙等。在比特幣系統里,每筆交易的確認均需要得到全網廣播,並收錄進Block後才能得到真正確認。每筆錢的花銷,均需要檢測上次輸入交易的狀態。數據是帶時間戳的、公開的,BlockChain由巨大的算力保障其安全性。所以比特幣系統將貨幣的多重支付的風險極大降低,幾近於零。通過等待多個Block確認,更是從概率上降低至零。一般得到6個確認後,可認為非常安全。但對於能影響你人生的重大支付,建議等待20~30個確認。
匿名性
任何人均可以輕易生成大量的私鑰、公鑰、地址。地址本身是匿名的,通過多個地址交易可進一步提高匿名性。但該匿名性並不像媒體宣傳的那樣,是某種程度上的匿名。因為比特幣的交易數據是公開的,所以任何一筆資金的流向均是可以追蹤的。
不了解比特幣的人為它的匿名性產生一些擔憂,比如擔心更利於從事非法業務;了解比特幣的人卻因為它的偽匿名性而苦惱。傳統貨幣在消費中也是匿名的,且是法律保障的,大部分國家都不允許個人塗畫紙幣。
地址本身是匿名的,但你可以通過地址對應的私鑰簽名消息來向公眾證明你擁有某個比特幣地址。
其他名詞
哈希
哈希(Hash)是一種函數,將一個數映射到另一個集合當中。不同的哈希函數映射的空間不同,反映到計算機上就是生成的值長度不一樣。同一個哈希函數,相同的輸入必然是相同的輸出,但同一個輸出卻可能有不同的輸入,這種情況稱為哈希碰撞。
常見的哈希函數有CRC32, MD5, SHA1, SHA-256, SHA-512, RIPEMD-160等,哈希函數在計算中有著非常廣泛的用途。比特幣里主要採用的是SHA-256和RIPEMD-160。
腦錢包紙錢包
前面提到過的腦錢包與紙錢包,這其實不算是錢包的分類,只是生成、存儲密鑰的方式而已。腦錢包屬於迷你私鑰的產物。腦錢包就是記在腦袋裡的密鑰,紙錢包就是列印到紙上的密鑰,僅此而已。
有同學提到過,以一個計算機文件作為輸入,例如一個數MB大小的照片,通過某種Hash運算後得到私鑰的方法。這個方案的安全性還是不錯的,同時可以防止盜私鑰木馬根據特徵掃描私鑰。文本形式存儲私鑰是有特徵的,而一個照片文件卻難以察覺,即使放在雲盤等第三方存儲空間中都是安全的。
⑼ ECDSA(橢圓曲線數字簽名演算法)
ECDSA(Elliptic Curve Digital Signature Algorithm)
在現實工作和生活中,我們使用簽名的方式表達對一份文件的認可,其他人可以識別出你的簽名並且無法偽造你的簽名。數字簽名就是對顯示簽名的一種電子實現,它不僅可以完全達到現實簽名的特點,甚至能夠做的更好。
常用的數字簽名演算法有RSA(Rivest-Shamir-Adleman Scheme)、DSS(Digital Signature Standard)等。 比特幣使用ECDSA來生成賬戶的公私鑰以及對交易和區塊進行驗證。
1.Alice(密碼學中常用A到Z開頭的人名代替甲乙丙丁等,字母越靠後出現頻率越低)生成一對密鑰,一個是sk(signing key),是非公開的;另一個是vk(verification key),是公開的。
這一對密鑰同時生成,並且在數學上是相互關聯的,同時,根據vk無法推測出關於sk的任何信息。
2.數字簽名演算法接收兩個輸出:信息M和sk,生成一個數字簽名Sm
3.驗證函數接收信息M、Sm以及vk作為輸入,,返回結果是yes或者no。這一步的目的是為了驗證你看到的針對信息M的數字簽名確實是由Alice的sk來簽發的,用於確認信息與簽名是否相符。
與手寫簽名不同,手寫簽名基本都是相似的,但是數字簽名卻受輸入影響很大。對輸入輕微的改變都會產生一個完全不同的數字簽名。一般不會對信息直接進行數字簽名,而是對信息的哈希值進行簽名。由加密哈希函數的無碰撞性可知,這樣和對原信息進行簽名一樣安全。
在數學上,任何滿足以下方程的點所形成的曲線稱為隨機橢圓曲線: 並且 ,a和b可以為任意值。下面展示幾個隨機橢圓函數的示例:
在了解如何通過基於secp256k1橢圓曲線的ECDSA演算法生成公私鑰之前,我們需要了解在隨機橢圓曲線里,點的加法是如何實現的。
首先定義橢圓曲線上點的加法。設橢圓曲線上有兩點,A和B點,那麼作過這兩點的直線與該曲線相交於第三點(C點),然後關於X軸對稱得到D點,則D為這兩個點的和,記作D=A+BD=A+BD=A+B。很明顯,D點也在該曲線上。所以橢圓曲線上兩點之和也是曲線上的點。
特例:
1.如果兩點重合,則做該點的切線,與曲線相交點的對稱點為和,即A+A=C
如圖:
有了加法以後,乘法實現是不過是進行多次加法運算。有了一個基準點P以後,我們可以對其進行乘法運算,最後可以得到曲線上的另外一個點。
設PPP是橢圓曲線上的一個點,那麼正整數kkk乘以點PPP的結果由下面的式子定義,注意式子中的加法是上面提到的橢圓曲線上點的加法:
點的運算滿足結合律:
很顯然,通過累加 的方式計算 是一種很笨的辦法,其時間復雜度是線性的。上面我們提到過,橢圓曲線上點的加法是滿足結合律的,即 ,擴展一下,就有
於是就有這么一種騷操作,比如計算 ,我們可以先計算 ;然後計算 ;再計算 ;最後計算 。這里我們把15次加法減少到了4次。
當然,k的值不可能總是2的冪。實際上上面的操作可以推廣到k為任意正整數的情況。比如計算23P,首先計算 ,然後
因為 ,所以 。總共只需要7次加法。
分析一下,對於任意正整數k,我們都可以利用這個方法將計算k∗P所需的加法計算次數降低到
也就是說,從時間復雜度的角度來看,這個演算法是一個 的演算法。
這個方法被稱為快速冪演算法,原本常用於快速計算某個數的k次冪,這里將其推廣到橢圓曲線點乘的快速計算中。
為什麼要在介紹了橢圓曲線上點的乘法後突然冒出一個快速冪演算法?快速冪演算法對於橢圓曲線加密有什麼意義?因為數學家/密碼學家發現,利用快速冪演算法計算 的時間復雜度是對數級的,但是要在知道 和 的前提下,倒推出 的值,沒有比挨個嘗試 的值快太多的演算法。於是橢圓曲線加密依賴的數學難題就這么誕生了。
如果我們改一種記法,把橢圓曲線上點的加法記作乘法,原來的乘法就變成了冪運算,那麼上述難題的形式跟離散對數問題應該是一致的。即:
所以這個難題叫橢圓曲線上的離散對數問題。
盡管兩者形式一致,但是他們並不等價。實際上這個問題比大整數質因子分解(RSA)和離散對數(DH)難題都要難得多,目前還沒有出現亞指數級時間復雜度的演算法(大整數質因子分解和離散對數問題都有),以致於同樣的安全強度下,橢圓曲線加密的密鑰比RSA和DH的短不少,這是橢圓曲線加密的一大優勢。
假設隨機取一個 ~ 位之間的值x,計算 ,最後的結果一定會落在曲線上的一點。假設該點為 ,在公開 以及具體曲線的方程的情況下,能否反推出最初的隨機值 ?
證:尋找 的過程只能通過暴力計算, 的可能值為 ~ 中的一個,平均來說需要計算 次能夠找到一次 值。那麼問題來了,運行一次 的計算需要多長的時間呢?
假設我們使用的是超級計算機,主頻為 (一秒鍾可以進行一萬億次運算),從宇宙誕生的那一刻開始計算,到現在也就進行了 次。找到 值的概率為 。這個概率和下一秒地球被巨型隕石撞擊而毀滅的概率接近,既然我們讀到了這里,那麼說明這件事沒有發生。
在上面的案例中, 是 ~ 位的一個隨機數,可以作為私鑰。 是隨機橢圓曲線上的一個點,也就是由私鑰生成的公鑰,因此優點可以1得證。
但是密碼學中,並不能使用上面介紹的實數域上的橢圓曲線。因為
所以我們需要引入有限域上的橢圓曲線。
要證明優點2,還需要將隨機橢圓曲線做一些改動:為了保證最後計算出來的點的坐標值相加是512位,secp256k1引入了一個對質數取模的機制。具體來說,隨機橢圓曲線從
變為了 其中 ,是小於 的最大質數。
此時的隨機橢圓曲線函數圖如下:
具體來說,就是向別人證明我知道 ,但不暴露 的任何信息。(有些類似於零知識證明)
證:前面介紹過結合律: 添加一個hash函數,簡單修改可以得出: 使 ,那麼可知 為 。此時方程為: 為了簡單起見,我們記 和 。此時方程化簡為: 上面這個方程是什麼意思呢?
可以這樣假設:在已知 的情況下,如果能夠提供一個 和 滿足上面的方程,就可以證明一個人擁有 。這個假設有一個前提,如果一個人不知道x,那麼他就無法提供 和 滿足上面的等式。
詳細探討這個前提:如果一個人不知道x,又想計算出 和 ,能夠辦到嗎?結論是不能,首先我們無法從 計算出 (在有限時間內)。
還有一個問題:在已知 和 的情況下,能否計算出關於 的任何信息?
根據公式: 只要解出 就可以了。
要想計算出x,就需要知道r,但是在r沒有公開的情況下,有什麼辦法可以計算r嗎?我們知道R=r*P;但是根據這個公式無法倒推出r(剛才介紹的那個數學難題),所以x也是安全的。
至此,可以證明演算法的第二個優點。