比特幣私鑰只是一個數字。你可以用硬幣、鉛筆和紙來隨機生成你的私鑰:擲硬幣 256 次,用紙和筆記錄正反面并轉換為 0 和 1,隨機得到的 256 位二進制數字可作為比特幣錢包的私鑰。該私鑰可進一步生成公鑰。
從一個隨機數生成私鑰
生成密鑰的第一步也是最重要的一步,是要找到足夠安全的熵源,即隨機性來源。生成一個比特幣私鑰在本質上與"在 1 到 2256 之 間選一個數字"無異。只要選取的結果是不可預測或不可重復的,那么選取數字的具體方法并不重要。比特幣軟件使用操作系統底層的隨機數生成器來產生 256 位 的熵(隨機性)。通常情況下,操作系統隨機數生成器由人工的隨機源進行初始化,也可能需要通過幾秒鐘內不停晃動鼠標等方式進行初始化。對于真正的偏執狂, 可以使用擲骰子的方法,并用鉛筆和紙記錄。
更準確地說,私鑰可以是 1 和 n-1 之間的任何數字,其中 n 是一個常數(n=1.158*1077,略小于 2256),并由比特幣所使用的橢圓曲線的階所定義。要生成這樣的一個私鑰,我們隨機選擇一個 256 位的數字,并檢查它是否小于 n-1。從編程的角度來看,一般是通過在一個密碼學安全的隨機源中取出一長串隨 機字節,對其使用 SHA256 哈希算法進行運算,這樣就可以方便地產生一個 256 位的數字。如果運算結果小于 n-1,我們就有了一個合適的私鑰。否則,我 們就用另一個隨機數再重復一次。
本書強烈建議讀者不要使用自己寫的代碼或使用編程語言內建的簡易隨機數生成器來獲得一個隨機數。我們建議讀者使用密碼學安全的偽隨機數生成器 (CSPRNG),并且需要有一個來自具有足夠熵值的源的種子。使用隨機數發生器的程序庫時,需仔細研讀其文檔,以確保它是加密安全的。對 CSPRNG 的 正確實現是密鑰安全性的關鍵所在。以下是一個隨機生成的私鑰(k),以十六進制格式表示(256 位的二進制數,以 64位十六進制數顯示,每個十六進制數占 4 位):
1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD
比特幣私鑰空間的大小是 2256,這是一個非常大的數字。用十進制表示的話,大約是 1077,而可見宇宙被估計只含有 1080 個原子。
要使用比特幣核心客戶端生成一個新的密鑰(參見之前文章),可使用getnewaddress 命令。出于安全考慮,命令運行后只顯示生成的公鑰,而不顯示私鑰。如果要bitcoind 顯示私鑰,可以使用dumpprivkey 命令。dumpprivkey 命令會把私鑰以 base58 校驗和編碼格式顯示,這種私鑰格式被稱為錢包導入格式(WIF,Wallet import Format),在"私鑰的格式"一節有詳細講解。下面給出了使用這兩個命令生成和顯示私鑰的例子:
$ bitcoind getnewaddress 1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy
$ bitcoind dumpprivkey 1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ
dumpprivkey 命令只是讀取錢包里由 getnewaddress 命令生成的私鑰,然后顯示出來。bitcoind 的并不能從公鑰得知私鑰。除非密鑰對都存儲在錢包里,dumpprivkey 命令才有效。
dumpprivkey 命令無法從公鑰得到對應的私鑰,因為這是不可能的。這個命令只是提取錢包中已有的私鑰,也就是提取由 getnewaddress 命令生成的私鑰。你也可以使用命令行 sx 工具 (參見"Libbitcoin和 sx Tools")用 newkey 命令來生成并顯示私鑰:
$ sx newkey 5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn








