1. 程式人生 > >公鑰私鑰以及比特幣地址的產生過程

公鑰私鑰以及比特幣地址的產生過程

一個比特幣錢包包含一系列的金鑰對,每個金鑰對都有一個公鑰(PublicKey)和私鑰(PrivateKey)。私鑰是由一個隨機產生的數字串經過雜湊的十六進位制字串,通過橢圓加密演算法可以用私鑰產生公鑰,然後就可以通過公鑰產生比特幣地址。從私鑰到公鑰再到比特幣地址是一個單向產生的過程,也就是說不能反向的用比特幣地址解出公鑰,或者從公鑰解出私鑰。
公鑰-->私鑰-->比特幣地址

私鑰

私鑰其本質就是一個256位的由0和1組成的隨機數,這個隨機數是怎麼產生的不重要,只要是不可預測和不可重複的都可以,比如可以將硬幣的正反面看成是0和1,然後隨機擲256次,記錄下的一串數字就可以作為私鑰。在比特幣中,私鑰的格式是將這個256位的隨機數以64位十六進位制數顯示,也就是64個(一個十六進位制數佔4位)我們所看到的用字母和數字組成的“亂碼”。下面是一個私鑰:

1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD

有人可能會想,這個私鑰會不會存在重複的,也就是完全相同的兩個私鑰,比特幣私鑰的空間大小為2^256,用十進位制表示大約是10^77,而在可見的宇宙中,原子數在 10^78 到 10^82 之間,所以私鑰的空間是一個很大的數,可以認為不存在相同的兩個私鑰。

公鑰

公鑰是將私鑰通過一個橢圓曲線乘法(K = k * G ,其中k是私鑰,G是被稱為生成點的常數點,而K是所得公鑰)的演算法計算得來,這是一個不可逆轉的過程,即不可能反向計算由公鑰計算得來私鑰。

橢圓曲線加密演算法

橢圓曲線加密法(可點選連結具體瞭解)是一種基於離散對數問題的非對稱加密法,可以用對橢圓曲線上的點進行加法或乘法運算來表達。 下圖是一個橢圓曲線的示例:
橢圓曲線
比特幣使用的是由美國國家標準與技術研究院 (NIST)設立的secp256k1標準所定義的一種特殊的橢圓曲線和一系列數學常數。secp256k1曲線由下述函式定義,該函式可產生一條橢圓曲線,然後利用這條曲線進而生成公鑰。
這裡寫圖片描述

生成公鑰

前面說過,比特幣中私鑰經過橢圓曲線乘法計算之後即可得到公鑰,且該過程不可逆轉,即只能通過私鑰得到公鑰,而不能右公鑰得到私鑰,下面講述一下橢圓曲線乘法的計算過程。
首先將之前所提到的私鑰與生成點G

相乘得到公鑰K

K = 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD * G

公鑰K 被定義為一個點K = (x, y) 其中

x = F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A 
y = 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB

我們的目標是找到生成點G 的倍數點kG ,在橢圓曲線中,點的相加等同於從該點畫切線找到與曲線相交的另一 點,然後翻折到x軸。下圖展示的是在橢圓曲線上找G、2G、4G的幾何操作。
這裡寫圖片描述

比特幣地址

比特幣地址是由公鑰經過一系列單向的雜湊演算法得到。雜湊演算法是一種單向函式,可以接收任意長度的輸入產生指紋或雜湊。由公鑰生成比特幣地址時使用的演算法是Secure Hash Algorithm (SHA)和the RACE Integ rity Primitives Evaluation Message Digest (RIPEMD),具體一點說就是SHA256RIPEMD160

以公鑰K為輸入,計算其SHA256雜湊,然後再計算RIPEMD160雜湊,所得到的160位(20位元組)的數字就是比特幣地址。

A = RIPEMD160(SHA256(K))  //其中K是公鑰,A是比特幣地址

但是,我們會發現產生的比特幣地址和我們使用者通常所見到的不一樣,這是因為為了提高可讀性、避免歧義並有效地防止在地址轉錄和輸入中產生錯誤,我們看到的比特幣地址是經過Base58Check編碼的,下圖描述了從公鑰產生比特幣地址的過程:
公鑰生成比特幣地址