比特幣密鑰是什麼?

比特幣密鑰是確定比特幣所有權機制的重要組成部分。每一個比特幣密鑰都是成對出現的,一個密鑰對由一個私鑰和一個公鑰組成。因此比特幣密鑰也常被成為比特幣密鑰對。

比特幣密鑰實際上並不存儲在比特幣網絡中,而是存儲在一個叫做錢包的文件或簡單的數據庫中。比特幣密鑰由用戶的錢包軟件生成並管理,無需參照區塊鍊或訪問網絡,其完全獨立於比特幣協議。

比特幣密鑰在比特幣去中心化信任和控制、所有權認證和安全性能方面均可發揮重要作用。

 

私鑰

私鑰本質上是一個256位的隨機整數。也就是說,比特幣私鑰其實只是一個數字,且這個數字是隨機生成的,同時這個數字長達256位。這就相當於以0和1標記硬幣正反面,累計拋256次硬幣才能得到這樣一個數字。

那麼這個隨機整數是如何生成的呢?

概括而言,比特幣私鑰的生成可以分為兩個步驟:隨機數生成+SHA256哈希算法運算。其中,隨機數生成是比特幣私鑰生成的第一步,也是最重要的一步,其本質是找到足夠安全的熵源,即隨機性來源。實際上,生成比特幣私鑰就相當於在1到2^256之間隨機選一個數字,並要求選取的結果是不可預測或不可重複的。或者更準確地說,比特幣私鑰可以是1和n-1之間的任何數字(n為常數,n=1.158*10^77,略小於2^256)。具體而言,比特幣使用操作系統底層的隨機數生成器作為隨機性來源,選取一長串隨機字節。隨後對其進行SHA256哈希算法運算,即可生成一個256位的數字。如果運算結果小於n-1,該數字即可成為一個私鑰,如若不然,則重新選取隨機數再進行運算。

如下所示,就是我們常見的一個比特幣私鑰:

但和上文所述不同的是,這個私鑰並非一個256位的隨機數。實際上,這是256位隨機整數的變體。因為如果將這個256位的隨機整數顯示出來,不僅識別率不高,且長度過長。因此,通常將這個256位的隨機整數以十六進製字符串表示。同時由於每兩個十六進製字符表示一個字節,則該十六進製字符串最終表現為32個字節組成的數組。

通過上述內容,我們已經知道,比特幣私鑰的上限是2^256,該數值非常巨大,已經遠超整個銀河系的原子總數。因此,想要遍歷(計算機術語,可以通俗理解為把每種組合都試一遍)所有的私鑰是不可能實現的。因此,比特幣私鑰實現了密碼學安全,這種安全性是由數學保證的。

私鑰的作用在於,在比特幣交易中生成支付比特幣所必需的數字簽名,以證明對比特幣的所有權。換句話說,假設你有10枚BTC,你的比特幣私鑰就是能夠證明這10枚BTC的確屬於你的唯一憑證。而也正是由於該特性,私鑰必須始終保持機密,一旦遭到洩露,相當於受該私鑰保護的比特幣將被拱手送人。對於比特幣用戶來說,也應該對私鑰進行備份,以防止意外丟失。私鑰一旦丟失就找不回來了,這意味著其對應的比特幣也將永遠丟失。

 

公鑰

公鑰是通過比特幣私鑰計算得來的。具體而言,比特幣通過橢圓曲線乘法運算私鑰從而得到公鑰。計算公式為:

其中,k為私鑰,G為橢圓曲線乘法中被稱為生成點,K為公鑰。生成點G是橢圓曲線乘法標準的一部分,比特幣密鑰的生成點都是相同的。因此,一個私鑰k乘以生成點G將得到對應唯一的一個公鑰K。

同時值得注意的是,上述計算過程是不可逆的。這就意味著,要對上述計算公式進行反向計算(也被稱為尋找離散對數),即已知公鑰K來反向求解私鑰k是非常困難的。因為這就相當於試驗所有可能的k值,等同於暴力搜索。而之所以可以實現該過程,則是由橢圓曲線乘法算法的特性決定的。

橢圓曲線乘法是被密碼學家稱之為具有“陷阱門”功能的一種函數,即在一個方向(乘法)很容易計算,而不可能在相反的方向(除法)進行計算。因此,比特幣私鑰所有者很容易通過橢圓曲線乘法計算創建公鑰,但反過來,沒有人可以通過公鑰計算出私鑰。正是由於這個特性,使得證明比特幣資金所有權的比特幣私鑰實現了不可偽造。

如果說私鑰用於比特幣支付時的交易簽名,公鑰則主要用於驗證比特幣交易。公鑰驗證比特幣交易主要表現在:1.公鑰生成地址,驗證發送交易的地址是否和該公鑰生成的地址一致;2.公鑰驗證私鑰的簽名,用來驗證該交易是否使用了正確的私鑰簽名。

 

比特幣地址

比特幣地址是一個由數字和字母組成的字符串,可以與任何人分享。

比特幣地址與公鑰並不相同。比特幣地址是公鑰通過加密哈希算法生成的。哈希算法是一種單向函數,可以接收任意長度的輸入而產生指紋或哈希。由公鑰生成比特幣地址使用的算法為SHA256和RIPEMD160。計算公式為:

其中,K為公鑰,A為生成的比特幣地址。具體而言,即以公鑰K為輸入,計算其SHA256哈希值,並以此結果計算RIPEMD160哈希值,得到一個長度為160位(20字節)的數字。

通常用戶見到的比特幣地址是經過“Base58Check”編碼後的形式,這種編碼使用了58個字符(一種Base58數字系統)和校驗碼,提高了可讀性、避免歧義並可有效防止在地址轉錄和輸入中產生錯誤。常見的比特幣地址如下所示:

在比特幣交易中,比特幣地址通常擔任收款方的角色,就相當於接收比特幣的收款人。其存在使得比特幣交易更為靈活。

總體來說,比特幣私鑰、公鑰和地址三者的關係可以歸結為下圖:

即基於私鑰k,可以使用橢圓曲線乘法計算產生一個對應的公鑰K;而後再基於公鑰K,可以使用單向加密哈希函數生成比特幣地址A。整個過程是不可逆的,只能從私鑰k計算出公鑰K進而生成地址A,但不能由地址A反向推導出公鑰K和私鑰k。

最後需要注意的是,公鑰和私鑰都可以有多種格式。雖然看起來可能不同,但是所編碼的是同樣的數字。這些不同的編碼格式主要是用來方便人們閱讀識別和存儲。