私鑰轉(zhuǎn)換
人類很難準(zhǔn)確記錄下一個二進(jìn)制私鑰并將其輸入軟件錢包。一旦發(fā)生錯誤,就有可能導(dǎo)致比特幣丟失。手寫無法使用校驗和來檢查錯誤,只有輸入計算機(jī)才可以。
一種解決方案是將二進(jìn)制數(shù)轉(zhuǎn)化成十進(jìn)制數(shù),讓私鑰變得更短、更好記。
假設(shè)一個二進(jìn)制數(shù)被切分成每 11 個數(shù)字一組,則每一組數(shù)最多可以表示 2048 個十進(jìn)制數(shù)(可表示的十進(jìn)制數(shù)范圍是 “0” 至 “2047”)。“0” 至 “2047” 轉(zhuǎn)化成二進(jìn)制就是 “00000000000” 至 “11111111111”。
我們可以將這個私鑰轉(zhuǎn)換成 24 組十進(jìn)制數(shù),每組十進(jìn)制數(shù)的范圍是 “0” 至 “2047”。這樣寫起來容易,但還是容易出錯。
BIP39 可以有效化解這一風(fēng)險。這個協(xié)議建議比特幣用戶使用一列由協(xié)議定義過的單詞表,我猜測這些單詞是經(jīng)過精挑細(xì)選的,以防被誤讀成其它單詞。
BIP 39 單詞表共包含 2048 個單詞,按照字母順序排列。點擊此處,查看列表。除了英文版,還有其它語言版本。每個單詞都代表 “0” 至 “2047” 之間的某個數(shù)字。這樣一來,私鑰中的每個十進(jìn)制數(shù)都可以被寫成一個單詞。數(shù)字和所對應(yīng)的單詞之間有什么特殊聯(lián)系嗎?沒有,這只是由協(xié)議定義的,只要我們都使用這個協(xié)議,那么單詞與數(shù)字之間就可以畫上等號。
這就是助記詞(seed words)的由來。你在軟件錢包中輸入助記詞后,每個單詞都會轉(zhuǎn)化成 11 個二進(jìn)制位,將它們組合起來就會形成一個 264 位的二進(jìn)制數(shù),也就是私鑰。如果是由 12 個單詞組成的助記詞,私鑰的長度只有一半,也就是 132 位。
遺憾的是,原始的 BIP 39 單詞表存儲在 GitHub 內(nèi),代表的十進(jìn)制數(shù)范圍是 “1” 至 “2048”,而非 “0” 至 “2047”。這只是 Github 格式的問題,而非有意設(shè)計成如此。
為了清楚地說明這個問題,我們來舉個例子。假設(shè)某個私鑰的開頭是 11 個 “0”,例如 “00000000000”,那么我們要用單詞表上的第一個單詞來表示這個二進(jìn)制數(shù)。第一個單詞是 “abandon”,表示的是 “00000000000”,但是被標(biāo)記成了 “1”。這是不對的。十進(jìn)制數(shù) “1” 轉(zhuǎn)化成二進(jìn)制是 “00000000001”,這不是我們想要的。但是,由于格式的問題,單詞表上所有單詞的序號都比它們實際代表的十進(jìn)制數(shù)大了 “1”。
我們還可以通過拋硬幣來生成二進(jìn)制數(shù)。計算機(jī)可以幫助我們獲得使用斜體表示的最后 8 位數(shù):
010000111111010111011001001000001010011010001000010001110001011011001001101111101000001111001000001101111100100001010100000101110110011000011011100001001101101111001110010101111001101000001001110000010000100100000111001110011110101110001100111010110111000100111111
我們首先要做的,是將這個二進(jìn)制數(shù)按照每 11 個數(shù)為一組進(jìn)行切分:
01000011111 10101110110 01001000001 01001101000 10000100011 10001011011 00100110111 11010000011 11001000001 10111110010 00010101000 00101110110 01100001101 11000010011 01101111001 11001010111 10011010000 01001110000 01000010010 00001110011 10011110101 11000110011 10101101110 00100111111
接下來,我們將每一組數(shù)轉(zhuǎn)化成十進(jìn)制數(shù):
543, 1398, 577, 616, 1059, 1115, 311, 1667, 1601, 1522, 168, 374, 781, 1555, 889, 1623, 1232, 624, 530, 115, 1269, 1587, 1390, 319
然后,我們查詢這些十進(jìn)制數(shù)在單詞表上對應(yīng)的單詞
全部轉(zhuǎn)化為單詞后就是:
dumb put else escape love merge cheap spare
sight salad bench conduct giant second hundred
slab old evoke drastic attack pact shoe punch child
請注意,所有單詞都是按字母排序的,首字母越靠前的單詞代表的數(shù)字越小,首字母越靠后的單詞代表的數(shù)字越大。當(dāng)你明白這些單詞的排序規(guī)律之后,可以明顯看出這點。
擴(kuò)展私鑰
擴(kuò)展私鑰最終用來生成一個錢包中的所有比特幣地址,而且可以花費這些地址上的比特幣。如上圖所示,擴(kuò)展私鑰可以生成多個獨立私鑰(不是擴(kuò)展私鑰,而是普通的私鑰),每個私鑰會生成獨立的公鑰,每個公鑰又會生成一個地址。
擴(kuò)展私鑰還可以用來生成接下來要詳細(xì)討論的擴(kuò)展公鑰。
我們無法根據(jù)單個獨立私鑰倒推出擴(kuò)展私鑰。這是我個人的理解,但是我不是密碼學(xué)專家,因此不能確定,不過這么想很合理。但是,每個獨立私鑰有可能指向后一個獨立私鑰,當(dāng)然這點我也不確定。因此,為確保萬無一失,別向任何人泄漏你的任何一個私鑰。
可以確定的是,任何一個公鑰都不會泄漏其對應(yīng)的私鑰。
擴(kuò)展公鑰
擴(kuò)展公鑰的用途不是很明顯。如果你仔細(xì)看示意圖的底部,你會發(fā)現(xiàn)使用擴(kuò)展公鑰通過錢包軟件生成的比特幣地址與使用擴(kuò)展私鑰生成的一樣,而且地址順序相同。使用擴(kuò)展公鑰和擴(kuò)展私鑰生成的錢包看起來完全一樣。那么區(qū)別在哪兒呢?
使用擴(kuò)展私鑰生成的錢包能夠進(jìn)行支付。
使用公鑰生成的錢包無法進(jìn)行支付。這種錢包通常被稱為 “觀察” 錢包。你可以將這個錢包放在安全性低的計算機(jī)上,不用擔(dān)心會丟失私鑰,但可以用來查看你的錢包余額,或是復(fù)制地址發(fā)送給其他人。
但你還是應(yīng)該注意保護(hù)好自己的擴(kuò)展公鑰。一旦泄漏,其他人就可以通過訪問你的擴(kuò)展公鑰來查詢你的錢包余額和你的所有地址。從今往后,他們都可以查詢你的錢包余額,就好像查詢你的銀行賬單一樣。
保護(hù)好你的金融隱私,更要保護(hù)好你的金融密鑰(比特幣私鑰)。
熱點:比特幣 比特幣地址 金融 銀行 計算機(jī) 比特幣 錢包 比特幣私鑰