比特幣交易涉及到很多密碼學(xué)知識(shí):公鑰崭篡、私鑰挪哄、哈希、對(duì)稱(chēng)加密琉闪、非對(duì)稱(chēng)加密迹炼、簽名等等。那么哪些是需要用戶(hù)認(rèn)真保管不能對(duì)外泄露的塘偎,那些是需要用戶(hù)公開(kāi)的呢疗涉?先從錢(qián)包地址的生成說(shuō)起。
錢(qián)包地址生成
1. 首先使用隨機(jī)數(shù)發(fā)生器生成一個(gè)『私鑰』吟秩。一般來(lái)說(shuō)這是一個(gè)256bits的數(shù)咱扣,擁有了這串?dāng)?shù)字就可以對(duì)相應(yīng)『錢(qián)包地址』中的比特幣進(jìn)行操作,所以必須被安全地保存起來(lái)涵防。
2. 『私鑰』經(jīng)過(guò)SECP256K1算法處理生成了『公鑰』闹伪。SECP256K1是一種橢圓曲線(xiàn)算法,通過(guò)一個(gè)已知『私鑰』時(shí)可以算得『公鑰』壮池,而『公鑰』已知時(shí)卻無(wú)法反向計(jì)算出『私鑰』偏瓤。這是保障比特幣安全的算法基礎(chǔ)。
3. 同SHA256一樣椰憋,RIPEMD160也是一種Hash算法厅克,由『公鑰』可以計(jì)算得到『公鑰哈希』橙依,而反過(guò)來(lái)是行不通的证舟。
4. 將一個(gè)字節(jié)的地址版本號(hào)連接到『公鑰哈纤镀欤』頭部(對(duì)于比特幣網(wǎng)絡(luò)的pubkey地址,這一字節(jié)為“0”)女责,然后對(duì)其進(jìn)行兩次SHA256運(yùn)算漆枚,將結(jié)果的前4字節(jié)作為『公鑰哈希』的校驗(yàn)值抵知,連接在其尾部墙基。
5. 將上一步結(jié)果使用BASE58進(jìn)行編碼(比特幣定制版本),就得到了『錢(qián)包地址』刷喜。
比如,?1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
『私鑰』『公鑰』『錢(qián)包地址』間的關(guān)系
在上述的五個(gè)步驟里只有“BASE58編碼”有相應(yīng)的可逆算法(“BASE58解碼”)残制,其他算法都是不可逆的,所以這些數(shù)據(jù)之間的關(guān)系可以表示為:
可以看到:
通過(guò)『私鑰』可以得到上述計(jì)算過(guò)程中所有的值吱肌。
『公鑰哈隙徊穑』和『錢(qián)包地址』可以通過(guò)互逆運(yùn)算進(jìn)行轉(zhuǎn)換,所以它們是等價(jià)的氮墨。
使用『私鑰』對(duì)交易進(jìn)行簽名
比特幣錢(qián)包間的轉(zhuǎn)賬是通過(guò)交易(Transaction)實(shí)現(xiàn)的。交易數(shù)據(jù)是由轉(zhuǎn)出錢(qián)包『私鑰』的所有者生成吐葵,也就是說(shuō)有了『私鑰』就可以花費(fèi)該錢(qián)包的比特幣余額规揪。生成交易的過(guò)程如下:
為了證明交易的生成者對(duì)“轉(zhuǎn)出錢(qián)包地址”余額有動(dòng)用的權(quán)利,需要錢(qián)包轉(zhuǎn)出者對(duì)交易進(jìn)行簽名温峭。簽名來(lái)源于私鑰
1. 交易的原始數(shù)據(jù)包括“轉(zhuǎn)賬數(shù)額”和“轉(zhuǎn)入錢(qián)包地址”猛铅,但是僅有這些是不夠的,因?yàn)闊o(wú)法證明交易的生成者對(duì)“轉(zhuǎn)出錢(qián)包地址”余額有動(dòng)用的權(quán)利凤藏。所以需要用『私鑰』對(duì)原始數(shù)據(jù)進(jìn)行簽名奸忽。
2. 生成“轉(zhuǎn)出錢(qián)包公鑰”,這一過(guò)程與生成『錢(qián)包地址』的第2步是一樣的揖庄。
3. 將“轉(zhuǎn)出簽名”和“轉(zhuǎn)出公鑰”添加到原始交易數(shù)據(jù)中栗菜,生成了正式的交易數(shù)據(jù),這樣它就可以被廣播到比特幣網(wǎng)絡(luò)進(jìn)行轉(zhuǎn)賬了蹄梢。
使用『公鑰』對(duì)簽名進(jìn)行驗(yàn)證
交易數(shù)據(jù)被廣播到比特幣網(wǎng)絡(luò)后疙筹,節(jié)點(diǎn)會(huì)對(duì)這個(gè)交易數(shù)據(jù)進(jìn)行檢驗(yàn),其中就包括對(duì)簽名的校驗(yàn)禁炒。如果校驗(yàn)正確而咆,那么這筆余額就成功地從“轉(zhuǎn)出錢(qián)包”轉(zhuǎn)移到“轉(zhuǎn)入錢(qián)包”了。
小結(jié)
如果一個(gè)『錢(qián)包地址』從未曾發(fā)送余額到其他『錢(qián)包地址』幕袱,那么它的『公鑰』是不會(huì)暴露在比特幣網(wǎng)絡(luò)上的暴备。而公鑰生成算法(SECP256K1)是不可逆的,即使『公鑰』暴露们豌,也很難對(duì)『私鑰』的安全性造成影響(難易取決于『私鑰』的生成算法)涯捻。
『私鑰』用來(lái)生成『公鑰』和『錢(qián)包地址』阁危,也用來(lái)對(duì)交易進(jìn)行簽名。擁有了『私鑰』就是擁有了對(duì)這個(gè)錢(qián)包余額的一切操作權(quán)力汰瘫。所以狂打,保護(hù)『私鑰』是所有比特幣錢(qián)包應(yīng)用最基本也是最重要的功能。