資料:
http://book.8btc.com/books/1/master_bitcoin/_book/4/4.html
http://book.8btc.com/books/6/masterbitcoin2cn/_book/glossary.html
私鑰-公鑰-地址
- 創(chuàng)建隨機(jī)私鑰 (64 位 16 進(jìn)制字符 / 256 比特 / 32 字節(jié))
- 從私鑰推導(dǎo)出公鑰 (128 位 16 進(jìn)制字符 / 512 比特 / 64 字節(jié))
- 從公鑰推導(dǎo)出地址 (40 位 16 進(jìn)制字符 / 160 比特 / 20 字節(jié))
生成私鑰
- 在 Linux 內(nèi)核中維護(hù)了一個(gè)熵池用來收集來自設(shè)備驅(qū)動(dòng)程序和其它來源的環(huán)境噪音痪蝇。熵(entropy)是描述系統(tǒng)混亂無序程度的物理量掷空,一個(gè)系統(tǒng)的熵越大則說明該系統(tǒng)的有序性越差闯狱,即不確定性越大谎替。
- 所以在選擇生成私鑰的隨機(jī)數(shù)方法時(shí),需要選擇滿足密碼學(xué)強(qiáng)度的隨機(jī)數(shù)方法湃望,比如 Node 中的 crypto.randomBytes换衬。當(dāng)你調(diào)用 crypto.randomBytes(32) 方法時(shí),它會(huì)等待熵池搜集足夠的信息后证芭,返回 64 位的隨機(jī)數(shù)瞳浦,即私鑰。
WIF 格式私鑰
- 比特幣私鑰其實(shí)是使用SHA-256生成的32字節(jié)(256位)的隨機(jī)數(shù)废士,有效私鑰的范圍則取決于比特幣使用的secp256k1 橢圓曲線數(shù)字簽名標(biāo)準(zhǔn)叫潦。
- 在私鑰的前面加上版本號(hào),后面添加壓縮標(biāo)志和附加校驗(yàn)碼官硝,(所謂附加校驗(yàn)碼矗蕊,就是對(duì)私鑰經(jīng)過2次SHA-256運(yùn)算,取兩次哈希結(jié)果的前四字節(jié))氢架,然后再對(duì)其進(jìn)行Base58編碼傻咖,就可以得到我們常見的WIF(Wallet import Format) 錢包導(dǎo)入格式格式的私鑰。
生成公鑰
以一個(gè)隨機(jī)生成的私鑰k為起點(diǎn)我們將其與曲線上已定義的 生成點(diǎn)G相乘以獲得曲線上的另一點(diǎn)岖研,也就是相應(yīng)的公鑰K卿操。生成點(diǎn)是secp256k1(橢圓算法)標(biāo)準(zhǔn)的一部分,比特幣密鑰的生成點(diǎn)都是相同的:
{K = k * G}
地址生成
將公鑰通過SHA256哈希算法處理得到32字節(jié)的哈希值
后對(duì)得到的哈希值通過RIPEMD-160算法來得到20字節(jié)的哈希值 —— Hash160
把版本號(hào)+Hash160組成的21字節(jié)數(shù)組進(jìn)行雙次SHA256哈希運(yùn)算孙援,得到的哈希值的頭4個(gè)字節(jié)作為校驗(yàn)和害淤,放置21字節(jié)數(shù)組的末尾。
對(duì)組成25位數(shù)組進(jìn)行Base58編碼拓售,就得到地址窥摄。
地址A = RIPEMD160(SHA256(公鑰K))
在比特幣中,大多數(shù)需要向用戶展示的數(shù)據(jù)都使用Base58Check編碼础淤,可以實(shí)現(xiàn)數(shù)據(jù)壓縮崭放,易讀而且有錯(cuò)誤檢驗(yàn)哨苛。
Base58Check編碼的比特幣地址是以1開頭的,
Base58Check編碼的私鑰WIF是以5開頭的莹菱,未壓縮過的以5開頭移国,壓縮過的以K 或者 L開頭。
例: 5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn (未壓縮)
KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ (壓縮)
比特幣地址產(chǎn)生的完整過程道伟,從私鑰迹缀、到公鑰(橢圓曲線上某個(gè)點(diǎn))、再到兩次哈希的地址蜜徽,最終產(chǎn)生Base58Check格式的比特幣地址祝懂。