密鑰和地址
比特幣的所有權是通過數字密鑰、比特幣地址和數字簽名來確定的。
大多數比特幣交易都需要一個有效的簽名才會被存儲在區塊鏈。只有有效的密鑰才能產生有效的數字簽名,因此擁有~密鑰副本就擁有了對該帳戶的比特幣的控制權。
一般情況下,比特幣地址由一個公鑰生成並對應於這個公鑰。然而,並非所有比特幣地址都是公鑰; 他們也可以代表其他支付對象,譬如腳本
公鑰加密和加密貨幣
比特幣正是使用橢圓曲線乘法作為其公鑰加密的基礎。
在比特幣系統中,我們用公鑰加密創建一個密鑰對,用於控制比特幣的獲取。密鑰對包括一個私鑰,和由其衍生出的唯 一的公鑰。公鑰用於接收比特幣,而私鑰用於比特幣支付時的交易簽名。
支付比特幣時,比特幣的當前所有者需要在交易中提交其公鑰和簽名(每次交易的簽名都不同,但均從同一個私鑰生成)。
大多數比特幣錢包工具為了方便會將私鑰和公鑰以密鑰對的形式存儲在一起。然而,公鑰可以由私鑰計算得到, 所以只存儲私鑰也是可以的。
私鑰和公鑰
私鑰是一個數字,通常是隨機產生的,有了私鑰後,使用橢圓曲線乘法這個單向加密函數產生一個公鑰,有了公鑰後,我們就可以使用一個單向加密哈希函數生成比特幣地址
私鑰
在比特幣交易中,私鑰用於生成支付比特幣所必需的簽名以證明對資金的所有權。
生成密鑰的第一步也是最重要的一步,是要找到足夠安全的熵源,即隨機性來源。
私鑰可以是 1 和 n-1 之間的任何數字,其中 n 是一個常數(n=1.158* 10^77,略小於 2^256),並被定義為由比特幣所使用的橢圓曲線的階。從編程的角度來看,一般是通過在一個密碼學安全的隨
機源中取出一長串隨機字節,對其使用 SHA256 哈希算法進行運算,這樣就可以方便地產生一個 256 位的數字。如果運算結果小於 n-1,我們就有了一個合適的私鑰。
公鑰
通過橢圓曲線乘法可以從私鑰計算得到公鑰,這是不可逆轉的過程:K = k * G 。G 是被稱為生成點的常數點
比特幣使用了 secp256k1 標準所定義的一種特殊的橢圓曲線和一系列數學常數。
生成點是 secp256k1 標準的一部分,比特幣密鑰的生成點都是相同的
大多數比特幣程序使用 OpenSSL 加密庫進行橢圓曲線計算。例如,調用EC_POINT_mul() 函數,可計算得到公鑰。
地址
比特幣地址可由公鑰經過單向的加密哈希算法得到。
由公鑰生成比特幣地址時是 SHA256 和 RIPEMD160使用的算法是
A = RIPEMD160(SHA256(K))
公式中,K 是公鑰,A 是生成的比特幣地址。通常用戶見到的比特幣地址是經過“Base58Check”編碼的。
Base58 和 Base58Check 編碼
Base64
使用了 26 個小寫字母、26 個大寫字母、10 個數字以及兩個符號(例 如“+”和“/”),用於在電子郵件這樣的基於文本的媒介中傳輸二進制數據。
Base58
由不包括(0,O,l,I)的大小寫字母和數字組成。
Base58Check 是一種常用在比特幣中的Base58 編碼格式,檢驗和是添加到正在編碼的數據末端的額外 4 個字節。
使用 Base58check 編碼時,解碼軟件會計算數據的校驗和並和編碼中自帶的校驗和進行對比。
在比特幣中,大多數需要向用戶展示的數據都使用 Base58Check 編碼,可以實現數據壓縮,易讀而且有錯誤檢驗。
Base58Check 編碼中的版本前綴是用來創造易於辨別的格式,
密鑰的格式
私鑰的格式
不同的格式用在不同的場景下。十六進制和原始的二進制格式用在軟件的內部,很少展示給用戶看。WIF 格式用在錢包之間密鑰的輸入和輸出,也用於代表私鑰的二維碼(條形碼)。
公鑰的格式
公鑰通常表示為前綴 04 緊接著兩個 256 比特的數字。其中一個 256 比特數字是公鑰的 x 坐標,另一個 256 比特數字是 y 坐標。前綴 04 是用來區分非壓縮格式公鑰,壓縮格式公鑰是以 02 或者 03 開頭。
如果我們知道了x,就可以通過公式求出y的坐標,從而將存儲空間減少256比特。02表示y是偶數,03表示y是奇數
"壓縮格式私鑰”是一個不當用詞!私鑰不是壓縮的。WIF 壓縮格式的私鑰只是用來表明他們只能被生成壓縮的公鑰和對應的比特幣地址。相反地,“WIF 壓縮” 編碼的私鑰還多出一個字節,因為這種私鑰多了後綴“01”。該後綴是用來區分“非壓縮格式”私鑰和“壓縮格式”私鑰。
密鑰和地址