一文讀懂比特幣的私鑰轉(zhuǎn)碼與使用
凡是關(guān)心自己的比特幣財(cái)產(chǎn)安全的人都應(yīng)該試著理解下圖:
數(shù)字
如果你完全理解二進(jìn)制、十進(jìn)制和十六進(jìn)制,可以跳過這部分。
十進(jìn)制指每一位數(shù)都有 10 種可能(0、1、2、3、4、5、6、7、8 或 9)。數(shù)字 “6.15” 有 3 位數(shù)(順帶一提,6.15 這個(gè)數(shù)字是有特殊含義的,即,每個(gè)人都應(yīng)該努力擁有 6.15 個(gè)比特幣)。第一個(gè)數(shù)是 “6”,第二個(gè)數(shù)是 “1”,第三個(gè)數(shù)是 “5”。這三個(gè)數(shù)可以是 0、1、2、3、4、5、6、7、8、9 中的任何一個(gè)。
在十進(jìn)制中,我們從 “0” 數(shù)到 “9”(0、1、2、3、4、5、6、7、8、9)就沒有新的數(shù)了,接下來就要在左邊新增一位 “1”(即,逢十進(jìn)一),得到 “10”,然后再從 “0” 開始數(shù)起 —— 原先的 “9” 進(jìn)了一位,十位數(shù)變成了 “1”,個(gè)位數(shù)變成了 “0”。
二進(jìn)制指每一位數(shù)只有兩種可能(“0” 和 “1”)。
在二進(jìn)制中,我們從 “0” 數(shù)起,然后是 “1” ,接著就是 “10”!看見沒?如果你覺得跨度很大,那是因?yàn)槟氵€沒有跳出十進(jìn)制思維。
在十進(jìn)制中,“10” 就是普通人的手指數(shù)量 —— 因?yàn)槲覀冇?10 個(gè)手指,所以我們?nèi)祟惓S?10 進(jìn)制。
但是,在二進(jìn)制中,“10” 就是一個(gè)人的大拇指的數(shù)量。想象一下用你的大拇指數(shù)數(shù):1、10、11、100、101、111、1000、1001…… (譯者注:這幾個(gè)數(shù)字換算成十進(jìn)制就是 1、2、3、4 ……)
如果這是你第一次了解二進(jìn)制,可以用紙和筆自己算一下,可能會有幫助。這就像是第一次學(xué)習(xí)數(shù)數(shù)那樣,而且還不能靠直覺。
十六進(jìn)制指每一位數(shù)有 16 種可能(0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f)。其中,a=10、b=11、c=12、d=13、e=14 和 f=15。
就像撲克牌游戲一樣,Jack=11、Queen=12、King=13、Ace=14 或 1。一個(gè)字母可以代表一個(gè)數(shù)字,這就是關(guān)鍵。
每一位數(shù)的可能性越多,表達(dá)一個(gè)大數(shù)字所用的位數(shù)就越少。例如,十進(jìn)制下的 2047 ,寫成二進(jìn)制就是 11111111111(11 位數(shù)),寫成十六進(jìn)制就是 7FF。
總結(jié):
隨機(jī)二進(jìn)制數(shù)、校驗(yàn)和、私鑰
私鑰首先是一個(gè)二進(jìn)制數(shù),可以轉(zhuǎn)換成其它形式。但是,私鑰本質(zhì)上是二進(jìn)制數(shù),因?yàn)樗菫榱私o計(jì)算機(jī)使用的。下面是二進(jìn)制私鑰的一個(gè)例子:
01000011111 10101110110 01001000001 01001101000 10000100011 10001011011 00100110111 11010000011 11001000001 10111110010 00010101000 00101110110 01100001101 11000010011 01101111001 11001010111 10011010000 01001110000 01000010010 00001110011 10011110101 11000110011 10101101110 00100111111
請注意,這個(gè)私鑰由 24 組數(shù)字組成,每 11 個(gè)數(shù)字為一組,共計(jì) 264 個(gè)二進(jìn)制數(shù)字(24×11=264)。
計(jì)算機(jī)看到的私鑰雖然是同一串?dāng)?shù)字,但是沒有空格:
010000111111010111011001001000001010011010001000010001110001011011001001101111101000001111001000001101111100100001010100000101110110011000011011100001001101101111001110010101111001101000001001110000010000100100000111001110011110101110001100111010110111000100111111
這是個(gè)很大的數(shù)字,寫成十進(jìn)制就是:
7,869,270,257,961,728,227,967,109,454,183,816,220,476,881,432,001,550,169,555,390,346,110,510,455,025,983
請注意這兩個(gè)數(shù)的值是一樣的,區(qū)別只在于十進(jìn)制寫起來更短。
總之,私鑰有一部分是隨機(jī)生成的,而最后 8 位(叫作校驗(yàn)和(checksum))是以前面的隨機(jī)部分作為輸入通過一個(gè)公式計(jì)算得出的。這是一種(軟件錢包共同認(rèn)可的)工程設(shè)計(jì):如果數(shù)據(jù)輸入不正確,計(jì)算機(jī)就會發(fā)現(xiàn)校驗(yàn)和與輸入數(shù)據(jù)不匹配,并警告用戶。錢包會提示 “抱歉,您的輸入可能有誤” 。當(dāng)然,用戶可以強(qiáng)行選擇繼續(xù)。校驗(yàn)和并非比特幣代碼的一部分,是為了保障用戶安全而引入的。
換言之……從數(shù)學(xué)設(shè)計(jì)上來講,在創(chuàng)建私鑰時(shí),下面這個(gè)隨機(jī)部分……
01000011111 10101110110 01001000001 01001101000 10000100011 10001011011 00100110111 11010000011 11001000001 10111110010 00010101000 00101110110 01100001101 11000010011 01101111001 11001010111 10011010000 01001110000 01000010010 00001110011 10011110101 11000110011 10101101110 001
只會生成下面這個(gè)校驗(yàn)和……
00111111
把二者結(jié)合起來就得到了最終的私鑰。點(diǎn)擊此處,了解私鑰是怎么來的,以及校驗(yàn)和是如何計(jì)算的。請注意,8 位數(shù)的校驗(yàn)和與末尾 3 個(gè)隨機(jī)數(shù)字組合起來剛好是一組 11 位數(shù)字,與其它幾組一樣(在 BIP39 標(biāo)準(zhǔn)下,一個(gè)單詞需要 11 位數(shù)表達(dá),詳見下文)。
不同的 隨機(jī) 二進(jìn)制數(shù)會產(chǎn)生不同的校驗(yàn)和。假設(shè)用戶在錢包里輸入私鑰,并聲稱 “這是我之前生成的私鑰,請顯示我的地址”,只要有一位數(shù)字錯(cuò)誤,軟件錢包都會發(fā)現(xiàn)并發(fā)出警告。
請?jiān)徫矣行﹩?,但是掌握這些背景知識真的很重要。
私鑰轉(zhuǎn)換
人類很難準(zhǔn)確記錄下一個(gè)二進(jìn)制私鑰并將其輸入軟件錢包。一旦發(fā)生錯(cuò)誤,就有可能導(dǎo)致比特幣丟失。手寫無法使用校驗(yàn)和來檢查錯(cuò)誤,只有輸入計(jì)算機(jī)才可以。
一種解決方案是將二進(jìn)制數(shù)轉(zhuǎn)化成十進(jìn)制數(shù),讓私鑰變得更短、更好記。
假設(shè)一個(gè)二進(jìn)制數(shù)被切分成每 11 個(gè)數(shù)字一組,則每一組數(shù)最多可以表示 2048 個(gè)十進(jìn)制數(shù)(可表示的十進(jìn)制數(shù)范圍是 “0” 至 “2047”)。“0” 至 “2047” 轉(zhuǎn)化成二進(jìn)制就是 “00000000000” 至 “11111111111”。
我們可以將這個(gè)私鑰轉(zhuǎn)換成 24 組十進(jìn)制數(shù),每組十進(jìn)制數(shù)的范圍是 “0” 至 “2047”。這樣寫起來容易,但還是容易出錯(cuò)。
BIP39 可以有效化解這一風(fēng)險(xiǎn)。這個(gè)協(xié)議建議比特幣用戶使用一列由協(xié)議定義過的單詞表,我猜測這些單詞是經(jīng)過精挑細(xì)選的,以防被誤讀成其它單詞。
BIP 39 單詞表共包含 2048 個(gè)單詞,按照字母順序排列。點(diǎn)擊此處,查看列表。除了英文版,還有其它語言版本。每個(gè)單詞都代表 “0” 至 “2047” 之間的某個(gè)數(shù)字。這樣一來,私鑰中的每個(gè)十進(jìn)制數(shù)都可以被寫成一個(gè)單詞。數(shù)字和所對應(yīng)的單詞之間有什么特殊聯(lián)系嗎?沒有,這只是由協(xié)議定義的,只要我們都使用這個(gè)協(xié)議,那么單詞與數(shù)字之間就可以畫上等號。
這就是助記詞(seed words)的由來。你在軟件錢包中輸入助記詞后,每個(gè)單詞都會轉(zhuǎn)化成 11 個(gè)二進(jìn)制位,將它們組合起來就會形成一個(gè) 264 位的二進(jìn)制數(shù),也就是私鑰(還記得嗎?最后一個(gè)單詞包含校驗(yàn)和,因此不是隨機(jī)的)。如果是由 12 個(gè)單詞組成的助記詞,私鑰的長度只有一半,也就是 132 位。
遺憾的是,原始的 BIP 39 單詞表存儲在 GitHub 內(nèi),代表的十進(jìn)制數(shù)范圍是 “1” 至 “2048”,而非 “0” 至 “2047”。這只是 Github 格式的問題,而非有意設(shè)計(jì)成如此。
為了清楚地說明這個(gè)問題,我們來舉個(gè)例子。假設(shè)某個(gè)私鑰的開頭是 11 個(gè) “0”,例如 “00000000000”,那么我們要用單詞表上的第一個(gè)單詞來表示這個(gè)二進(jìn)制數(shù)。第一個(gè)單詞是 “abandon”,表示的是 “00000000000”,但是被標(biāo)記成了 “1”。這是不對的。十進(jìn)制數(shù) “1” 轉(zhuǎn)化成二進(jìn)制是 “00000000001”,這不是我們想要的。但是,由于格式的問題,單詞表上所有單詞的序號都比它們實(shí)際代表的十進(jìn)制數(shù)大了 “1”。
我們還可以通過拋硬幣來生成二進(jìn)制數(shù)。計(jì)算機(jī)可以幫助我們獲得使用斜體表示的最后 8 位數(shù):
0100001111110101110110010010000010100110100010000100011100010110110010011011111010000011110010000011011111001000010101000001011101100110000110111000010011011011110011100101011110011010000010011100000100001001000001110011100111101011100011001110101101110001*00111111*
我們首先要做的,是將這個(gè)二進(jìn)制數(shù)按照每 11 個(gè)數(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)的單詞:
考考你:十進(jìn)制數(shù) 543 對應(yīng)的是哪個(gè)單詞?Dry、duck 還是 dumb?
上圖是從 Github 上截取的,因此這張單詞表的序號是從 “1” 開始的。因此,每個(gè)序號都減去 “1” 之后才是每個(gè)單詞真正對應(yīng)的十進(jìn)制數(shù)。 因此,序號 544 的單詞 dumb 實(shí)際上代表的是 “543”,也就是我們要找的那個(gè)單詞。
第二個(gè)數(shù)是 1398,對應(yīng)的是單詞表上序號為 1399 的單詞。
全部轉(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ī)律之后,可以明顯看出這點(diǎn)。
擴(kuò)展私鑰
再來看下面這張圖:
擴(kuò)展私鑰是使用二進(jìn)制私鑰以及密語(passphrase)和衍生路徑(derivation path),根據(jù)你我都沒必要知道的數(shù)學(xué)公式計(jì)算得出的。
請注意增加密語是如何徹底改變下游擴(kuò)展私鑰的。修改衍生路徑也會改變下游數(shù)據(jù)。不要小看了你的軟件錢包提供的默認(rèn)衍生路徑,請務(wù)必把它寫下來保存好。我會另外寫一篇文章來詳細(xì)介紹衍生路徑。
擴(kuò)展私鑰最終用來生成一個(gè)錢包中的所有比特幣地址,而且可以花費(fèi)這些地址上的比特幣。如上圖所示,擴(kuò)展私鑰可以生成多個(gè)獨(dú)立私鑰(不是擴(kuò)展私鑰,而是普通的私鑰),每個(gè)私鑰會生成獨(dú)立的公鑰,每個(gè)公鑰又會生成一個(gè)地址。
擴(kuò)展私鑰還可以用來生成接下來要詳細(xì)討論的擴(kuò)展公鑰。
我們無法根據(jù)單個(gè)獨(dú)立私鑰倒推出擴(kuò)展私鑰。這是我個(gè)人的理解,但是我不是密碼學(xué)專家,因此不能確定,不過這么想很合理。但是,每個(gè)獨(dú)立私鑰有可能指向后一個(gè)獨(dú)立私鑰,當(dāng)然這點(diǎn)我也不確定。因此,為確保萬無一失,別向任何人泄漏你的任何一個(gè)私鑰。
可以確定的是,任何一個(gè)公鑰都不會泄漏其對應(yīng)的私鑰。明白這一點(diǎn)很重要。
我在 https://iancoleman.io/bip39/ 上生成了一個(gè)測試錢包。這個(gè)網(wǎng)站是練習(xí)生成虛擬錢包的好地方(千萬別在聯(lián)網(wǎng)的電腦上使用這種方式生成真的錢包)。
擴(kuò)展私鑰如下所示:
請注意,上圖顯示的是 “賬戶” 擴(kuò)展私鑰。我不知道這個(gè)網(wǎng)站為什么要這么標(biāo)記。
再來看這個(gè)擴(kuò)展私鑰的開頭是 “x”。這意味著使用這個(gè)私鑰將生成以 “1” 開頭的傳統(tǒng)地址。傳統(tǒng)地址也叫作 P2PKH(pay to public key hash,支付到公鑰哈希值)地址。
使用以 “y” 開頭的私鑰(或公鑰)會生成以 “3” 開頭的地址。這些地址也叫作 P2SH(Pay to script hash,支付到腳本哈希值)地址。
使用以 “z” 開頭的私鑰會生成原生的 segwit/Bech32 地址。這類地址以 “bc1q” 開頭。
最后,以大寫字母 “X”、“Y” 或 “Z” 開頭的私鑰會生成多簽錢包的地址。
擴(kuò)展公鑰
擴(kuò)展公鑰的用途不是很明顯。如果你仔細(xì)看示意圖的底部,你會發(fā)現(xiàn)使用擴(kuò)展公鑰通過錢包軟件生成的比特幣地址與使用擴(kuò)展私鑰生成的一樣,而且地址順序相同。使用擴(kuò)展公鑰和擴(kuò)展私鑰生成的錢包看起來完全一樣。那么區(qū)別在哪兒呢?
使用擴(kuò)展私鑰生成的錢包能夠進(jìn)行支付。
使用公鑰生成的錢包無法進(jìn)行支付。這種錢包通常被稱為 “觀察” 錢包。你可以將這個(gè)錢包放在安全性低的計(jì)算機(jī)上,不用擔(dān)心會丟失私鑰,但可以用來查看你的錢包余額,或是復(fù)制地址發(fā)送給其他人。
但你還是應(yīng)該注意保護(hù)好自己的擴(kuò)展公鑰。一旦泄漏,其他人就可以通過訪問你的擴(kuò)展公鑰來查詢你的錢包余額和你的所有地址。從今往后,他們都可以查詢你的錢包余額,就好像查詢你的銀行賬單一樣。
保護(hù)好你的金融隱私,更要保護(hù)好你的金融密鑰(比特幣私鑰)。
注:擴(kuò)展公鑰如下圖所示:
如上圖所示,公鑰不是以 “xprv” 開頭,而是以 “xpub” 開頭,另外也可以 “ypub”、“zpub”、“Xpub”、 “Ypub” 和 “Zpub” 開頭。(大寫指的是多簽私鑰。)
總結(jié)
我希望這篇文章能幫助你理解比特幣的公鑰和私鑰,進(jìn)而讓你更容易理解比特幣的運(yùn)作原理。
如果你有任何問題,請聯(lián)系我,或閱讀我的輔導(dǎo)材料。
讀懂了這篇文章會讓你更容易理解如何通過擲骰子的方式生成助記詞,多簽錢包的生成以及 PGP 加密。
補(bǔ)充閱讀
點(diǎn)擊此處,了解什么是衍生路徑。
以上就是一文讀懂比特幣的私鑰轉(zhuǎn)碼與使用的詳細(xì)內(nèi)容,更多關(guān)于比特幣的私鑰轉(zhuǎn)碼與使用的資料請關(guān)注腳本之家其它相關(guān)文章!
你可能感興趣的文章
-
比特幣錢包私鑰在哪查看?比特派錢包查看私鑰方法
這篇文章主要介紹了比特幣錢包私鑰在哪查看?比特派錢包查看私鑰的方法的相關(guān)資料,希望這篇關(guān)于比特派錢包查看私鑰方法的文章,能讓大家對比特派錢包有個(gè)更加深入的了解?!?/p> 2021-11-18
-
詳細(xì)描述什么是比特幣私鑰、賬戶與錢包
這篇文章主要介紹了詳細(xì)描述什么是比特幣私鑰、賬戶與錢包,對于比特幣用戶來講,與它們最直接相關(guān)的就是比特幣中私鑰、賬戶及錢包了,這里講述一下這三個(gè)概念及相關(guān)細(xì)節(jié)?!?/p> 2021-04-07
-
區(qū)塊鏈科普:什么是以太坊私鑰儲存(Keystore)文件?
這篇文章主要介紹了區(qū)塊鏈科普:什么是以太坊私鑰儲存(Keystore)文件的相關(guān)資料,希望這篇關(guān)于什么是以太坊私鑰儲存(Keystore)文件的文章,能夠幫助到各位朋友對區(qū)塊鏈錢包…
2021-12-13 -
區(qū)塊鏈錢包科普:如何通過私鑰創(chuàng)建以太坊錢包地址?
這篇文章主要介紹了區(qū)塊鏈錢包科普:如何通過私鑰創(chuàng)建以太坊錢包地址的相關(guān)資料,希望這篇關(guān)于如何通過私鑰創(chuàng)建以太坊錢包地址的文章,能夠幫助到各位朋友對區(qū)塊鏈錢包原理…
2021-12-13 -
導(dǎo)入助記詞和私鑰報(bào)錯(cuò)怎么辦?助記詞導(dǎo)入注意事項(xiàng)
這篇文章主要介紹了導(dǎo)入助記詞和私鑰報(bào)錯(cuò)怎么辦?助記詞導(dǎo)入注意事項(xiàng)的相關(guān)資料,希望這篇關(guān)于導(dǎo)入助記詞和私鑰報(bào)錯(cuò)怎么辦?助記詞導(dǎo)入注意事項(xiàng)的文章,能夠幫助各位朋友對助…
2021-12-09 -
錢包科普:想要安全地保管資產(chǎn),先要知道錢包的這些知識
這篇文章主要介紹了科普:想要安全地保管資產(chǎn),先要知道錢包的這些知識的相關(guān)資料,希望這篇關(guān)于存儲區(qū)塊鏈資產(chǎn)的錢包的文章,能夠幫助到各位新人投資者對錢包有一個(gè)深入的了…
2021-12-01 -
imToken錢包如何導(dǎo)入EOS錢包私鑰操作教程
這篇文章主要介紹了imToken錢包如何導(dǎo)入EOS錢包私鑰操作教程的相關(guān)資料,希望這篇關(guān)于imToken錢包導(dǎo)入EOS錢包私鑰操作教程的文章,能夠使大家對imToken錢包有個(gè)更加深入的…
2021-11-23 -
比特派錢包如何導(dǎo)入私鑰&密語來提取資產(chǎn)?
這篇文章主要介紹了比特派錢包如何導(dǎo)入私鑰&密語來提取資產(chǎn)?的相關(guān)資料,本文以導(dǎo)入BTC為例和BTC HD密語導(dǎo)入為例,圖文詳細(xì)講解如何導(dǎo)入私鑰和密語來提取資產(chǎn)的。下面…
2021-11-08 -
將EOS私鑰導(dǎo)入AToken錢包的方法
這篇文章主要介紹了將EOS私鑰導(dǎo)入AToken錢包的方法,AToken錢包已經(jīng)支持EOS賬戶管理一段時(shí)間了,但是很多用戶還不知道具體如何導(dǎo)入EOS賬戶私鑰。下面小編帶大家一起學(xué)習(xí)一…
2021-08-16 -
火幣錢包助記詞忘了怎么辦?火幣錢包備份助記詞及導(dǎo)出私鑰教程
這篇文章主要介紹了火幣錢包助記詞忘了怎么辦?火幣錢包備份助記詞及導(dǎo)出私鑰教程的相關(guān)資料,有些投資者問小編:自己的token錢包助記詞忘了怎么解決!其實(shí)這個(gè)問題并不是一…
2023-12-19