一文讀懂比特幣私鑰、公鑰、錢包地址的來歷和關(guān)系

【轉(zhuǎn)自:https://zhuanlan.zhihu.com/p/28036845
對(duì)比特幣熟悉的朋友一定都知道,買賣比特幣最后都是通過一個(gè)錢包地址來實(shí)現(xiàn)的,就像我們?nèi)粘J褂玫你y行卡卡號(hào),我們隨便找一個(gè)比特幣的錢包地址,大家看一下:

1QCXRuoxWo5Bya9NxHaVBArBQYhatHJrU7

但是當(dāng)談到比特幣的錢包地址是如何算出來的時(shí)候,可能就很少有人能夠說清楚了。

下面,景辰通過實(shí)際計(jì)算,來給大家講解一下比特幣的錢包地址是怎么來的,公鑰、私鑰是怎么來的,以及他們?nèi)咧g的關(guān)系。

下面的過程你不一定懂得轉(zhuǎn)換的原理,知道他們流轉(zhuǎn)的過程就可以了。

眾所周知,比特幣是建立在數(shù)學(xué)加密學(xué)基礎(chǔ)上的,而不是像銀行卡那樣是基于信用的,基于信用體系的銀行卡卡號(hào)我們都熟悉,是我們?cè)谙蜚y行申請(qǐng)銀行卡的時(shí)候銀行給隨機(jī)發(fā)的,那么比特幣的錢包地址是怎么來的呢?

在《比特幣:一種點(diǎn)對(duì)點(diǎn)的電子現(xiàn)金系統(tǒng)》一文中,中本聰提到了用橢圓加密算法(ECDSA)來產(chǎn)生比特幣的私鑰和公鑰。

基于橢圓加密的原理,由私鑰是可以計(jì)算出公鑰的,再由公鑰經(jīng)過一系列數(shù)字簽名運(yùn)算就會(huì)得到比特幣錢包地址。

因?yàn)橛晒€可以算出比特幣地址,所以我們經(jīng)常把公鑰和比特幣地址的說法相混淆,他們都是指的同一個(gè)概念,比特幣錢包地址只是另一種格式的公鑰,但是兩者的外在表現(xiàn)形式是不一樣的。

那么我們就可以梳理出一個(gè)脈絡(luò)了:

私鑰 —— 公鑰 —— 比特幣錢包地址

從比特幣私鑰得到我們?nèi)粘^D(zhuǎn)賬所用的比特幣錢包地址總共需要九個(gè)步驟,中間用到了SHA256加密、RIPEMD160加密和BASE58編碼。

下面,我們以實(shí)際案例來模擬一下整個(gè)流程:

第一步:生成隨機(jī)私鑰

私鑰是一個(gè)隨機(jī)數(shù),隨機(jī)選取一個(gè)32字節(jié)的數(shù),這個(gè)數(shù)的范圍大小是介于1 ~ 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4141之間的一個(gè)數(shù),為了方便后面的計(jì)算,我們隨機(jī)生成一個(gè)合法的私鑰:

8F72F6B29E6E225A36B68DFE333C7CE5E55D83249D3D2CD6332671FA445C4DD3

第二步:橢圓曲線算公鑰

生成了私鑰之后,我們使用橢圓曲線加密算法(ECDSA-secp256k1)計(jì)算私鑰所對(duì)應(yīng)的非壓縮公鑰,生成的公鑰共65字節(jié), 其中一個(gè)字節(jié)是0x04,其中32個(gè)字節(jié)是X坐標(biāo),另外32個(gè)字節(jié)是Y坐標(biāo):

公鑰P.X:

06CCAE7536386DA2C5ADD428B099C7658814CA837F94FADE365D0EC6B1519385

公鑰P.Y:

FF83EC5F2C0C8F016A32134589F7B9E97ACBFEFD2EF12A91FA622B38A1449EEB

第三步:計(jì)算公鑰的SHA-256哈希值

將上述公鑰地址拼合,得到標(biāo)準(zhǔn)地址:

0406CCAE7536386DA2C5ADD428B099C7658814CA837F94FADE365D0EC6B1519385FF83EC5F2C0C8F016A32134589F7B9E97ACBFEFD2EF12A91FA622B38A1449EEB

對(duì)齊進(jìn)行SHA-256哈希計(jì)算,得到結(jié)果:

2572e5f4a8e77ddf5bb35b9e61c61f66455a4a24bcfd6cb190a8e8ff48fc097d

第四步:計(jì)算 RIPEMD-160哈希值

取上一步結(jié)果,進(jìn)行RIPEMD-160計(jì)算,得到結(jié)果:

0b14f003d63ab31aef5fedde2b504699547dd1f6

第五步:加入地址版本號(hào)(比特幣主網(wǎng)版本號(hào)“0x00”)

取上一步結(jié)果,在前面加上16進(jìn)制的00,即:

000b14f003d63ab31aef5fedde2b504699547dd1f6

第六步:計(jì)算 SHA-256 哈希值

取上一步結(jié)果,進(jìn)行SHA-256計(jì)算,可得:

ddc2270f93cc84cc6869dd373f3c340bbf5cb9a8f5559297cc9e5d947aab2536

然后,對(duì)以上結(jié)果再次計(jì)算 SHA-256 哈希值,得到:

869ac57b83ccf75ca9da8895823562fffb611e3c297d9c2d4612aeeb32850078

第七步:取上一步結(jié)果的前4個(gè)字節(jié)(8位十六進(jìn)制)

869ac57b

第八步:把這4個(gè)字節(jié)加在第五步的結(jié)果后面

作為校驗(yàn)位,將這4個(gè)字節(jié)加載第五步的結(jié)果后面,這就是比特幣地址的16進(jìn)制形態(tài)了:

869ac57b000b14f003d63ab31aef5fedde2b504699547dd1f6

第九步:用Base58編碼變換一下地址

對(duì)上一步的結(jié)果進(jìn)行Base58編碼,得到:

1QCXRuoxWo5Bya9NxHaVBArBQYhatHJrU7

這就是我們經(jīng)常看到的傳統(tǒng)意義上的比特幣錢包地址了。

以上步驟可以簡化為下圖所示:

<figure style="margin: 24px 0px;">
image

</figure>

我們經(jīng)常說的比特幣公鑰就是指的圖中第二步所產(chǎn)生的結(jié)果,而HASH160指的是第四步RIPEMD160簽名所產(chǎn)生的結(jié)果,由于RIPEMD也是一種HASH算法所以就統(tǒng)稱為HASH160了,而我們常用的比特幣地址就是經(jīng)過BASE58編碼后的結(jié)果。

推薦往期閱讀:區(qū)塊鏈在交易發(fā)展演進(jìn)中的地位區(qū)塊鏈的地位 | 區(qū)塊鏈的來源 | 比特幣的概念 | 瘋狂的ICO | 助力跨境支付

發(fā)布于 2017-07-22

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容