隨著比特幣的盛行,小編相信很多聽說過比特幣的人都知道比特幣是一種虛擬數字貨幣,而比特幣的特點是去中心化和匿名性,由此也就體現出比特幣密鑰的重要性,那么,有很多幣圈小白就要問了,比特幣密鑰是什么?比特幣密鑰生成的原理又是什么樣的?下面小編就給大家來解析一下。
比特幣包含一系列密鑰對,每個密鑰對包含一個公鑰和私鑰。私鑰是一個隨機數,私鑰通過橢圓曲線算法生成公鑰,公鑰再通過單向加密哈希函數生成比特幣地址。比特幣使用非對稱加密,使得簽名只能由私鑰產生,且在不泄露私鑰情況下所有人都可以驗證該簽名p。私鑰和公鑰有可以被編碼成多種類型格式,無一例外的作用就是為了方便識別及錢包操作方便。
私鑰可以理解為一個隨機數,比特幣地址中資金的控制取決于相應私鑰的控制權,比特幣交易中,私鑰用于生成支付比特幣所必需的簽名以證明對資金的所有權。
選擇隨機性來源(熵源),生成一個比特幣私鑰在本質上與“在1到22562256之間選一個數字”無異。建議使用密碼學安全的偽隨機數生成器(CSPRNG),并且需要有一個來自具有足夠熵值的源的種子。
通過橢圓曲線算法可以由私鑰生成公鑰,該過程是不可逆的過程:K(公鑰)=k(私鑰)*G(常數點)。其反向運算,被稱為“尋找離散對數”--已知公鑰K來求出私鑰k--是極其困難的。
橢圓曲線加密法是一種基于離散對數問題的非對稱(或公鑰)加密法,可以用對橢圓曲線上的點進行加法或乘法運算來表達。
一、通過操作系統(tǒng)隨機數生成器生成一個隨機數,并進行SHA256哈希運算(結果必須是1到n-1之間的任何數字,n=1.158 * 1077),該數字即為私鑰最原始的內容,所以需要通過密碼學安全的隨機源中選出一串隨機字節(jié),以防暴力破解使用SHA256哈希運算是為了方便產生一個固定長度為256位的數字,使用十六進制表示如下:6954ac6d0402d7239f1cc150da224d0ef08fd1226f245f06fe4d6d68accfce8a
二、如果使用壓縮公鑰,在私鑰的結果后面增加0x01;若使用非壓縮公鑰,則不追加0x01.私鑰的后綴01用于告訴錢包私鑰對應的公鑰和地址是壓縮格式還是非壓縮格式的。原因是同一私鑰的壓縮公鑰與非壓縮公鑰是不同的,生成的地址也完全不同,也就是說會出現兩個公鑰和兩個地址對應一個私鑰的情況,如果沒有標識,錢包無法將私鑰與公鑰和地址一一對應。本次使用壓縮格式舉例
6954ac6d0402d7239f1cc150da224d0ef08fd1226f245f06fe4d6d68accfce8a01
三、對私鑰進行base58check編碼,即轉換為WIF(Wallet Import Format)格式
在私鑰前添加版本前綴,0x80為WIF前綴
806954ac6d0402d7239f1cc150da224d0ef08fd1226f245f06fe4d6d68accfce8a01
將上面結果進行double-SHA256運算后取前四字節(jié)作為校驗碼拼接在最后,然后進行base58編碼得到私鑰的最終形態(tài)(非WIF壓縮格式的結果前綴為5.WIF壓縮格式的結果前綴為K或L)KzkTe43L5cbSX64txJMcsFvJC6vov7nYaGdYicz5N8Mds4ThN2XM
四、使用secp256k1橢圓曲線算法將私鑰轉換為公鑰(Gx,Gy),橢圓曲線算法是一種基于離散對數問題的非對稱加密法,其數學運算是單向的,所以私鑰可以轉換成公鑰,但公鑰不能轉換回私鑰,將上面的結果轉換后得到如下結果(十六進制):(0ba1ba3b8d8f7bd4a70828ec0e749dd26ee4cdd18d058c880afa121fad60e5b6.f2ee1b72d9b9a57706e5de72acc1378f92269086c4964c073593bf92d28c647d)
將公鑰合并成為十六進制數
壓縮公鑰可以大大節(jié)省公鑰所占空間(減少256bits),是比特幣客戶端當前的默認格式,并且也兼容非壓縮公鑰,未壓縮(前綴04.將Gx,Gy拼接)
040ba1ba3b8d8f7bd4a70828ec0e749dd26ee4cdd18d058c880afa121fad60e5b6f2ee1b72d9b9a57706e5de72acc1378f92269086c4964c073593bf92d28c647d
壓縮(y為偶數前綴02.y為奇數前綴03.僅保留Gx,Gy可通過Gx計算)
030ba1ba3b8d8f7bd4a70828ec0e749dd26ee4cdd18d058c880afa121fad60e5b6
六、將公鑰轉換為比特幣地址
1.RIPEMD160(SHA256(公鑰))得出20字節(jié)/160 bits公鑰哈希,使用兩種Hash函數轉換最大的好處是如果其中一種函數被破解,仍然能保證安全性。
2.對公鑰哈希進行Base58check編碼(版本前綴 + 公鑰哈希 + SHA256(SHA256(版本前綴+公鑰哈希))前4字節(jié)進行Base58編碼),此處為P2PKH地址,前綴為0x00.得到最終的比特幣地址如下:17FjrmErg5a39P7UsyYCchpyzSnq9gmMuJ
小編推薦閱讀