比特幣交易涉及到很多密碼學知識:公鑰、私鑰、哈希、對稱加密、非對稱加密、簽名等等。那么哪些是需要用戶認真保管不能對外泄露的,那些是需要用戶公開的呢?先從錢包地址的生成說起。
錢包地址生成
1. 首先使用隨機數發生器生成一個『私鑰』。一般來說這是一個256bits的數,擁有了這串數字就可以對相應『錢包地址』中的比特幣進行操作,所以必須被安全地保存起來。
2. 『私鑰』經過SECP256K1算法處理生成了『公鑰』。SECP256K1是一種橢圓曲線算法,通過一個已知『私鑰』時可以算得『公鑰』,而『公鑰』已知時卻無法反向計算出『私鑰』。這是保障比特幣安全的算法基礎。
3. 同SHA256一樣,RIPEMD160也是一種Hash算法,由『公鑰』可以計算得到『公鑰哈希』,而反過來是行不通的。
4. 將一個字節的地址版本號連接到『公鑰哈希』頭部(對于比特幣網絡的pubkey地址,這一字節為“0”),然后對其進行兩次SHA256運算,將結果的前4字節作為『公鑰哈希』的校驗值,連接在其尾部。
5. 將上一步結果使用BASE58進行編碼(比特幣定制版本),就得到了『錢包地址』。
比如,?1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
『私鑰』『公鑰』『錢包地址』間的關系
在上述的五個步驟里只有“BASE58編碼”有相應的可逆算法(“BASE58解碼”),其他算法都是不可逆的,所以這些數據之間的關系可以表示為:
可以看到:
通過『私鑰』可以得到上述計算過程中所有的值。
『公鑰哈希』和『錢包地址』可以通過互逆運算進行轉換,所以它們是等價的。
使用『私鑰』對交易進行簽名
比特幣錢包間的轉賬是通過交易(Transaction)實現的。交易數據是由轉出錢包『私鑰』的所有者生成,也就是說有了『私鑰』就可以花費該錢包的比特幣余額。生成交易的過程如下:
為了證明交易的生成者對“轉出錢包地址”余額有動用的權利,需要錢包轉出者對交易進行簽名。簽名來源于私鑰
1. 交易的原始數據包括“轉賬數額”和“轉入錢包地址”,但是僅有這些是不夠的,因為無法證明交易的生成者對“轉出錢包地址”余額有動用的權利。所以需要用『私鑰』對原始數據進行簽名。
2. 生成“轉出錢包公鑰”,這一過程與生成『錢包地址』的第2步是一樣的。
3. 將“轉出簽名”和“轉出公鑰”添加到原始交易數據中,生成了正式的交易數據,這樣它就可以被廣播到比特幣網絡進行轉賬了。
使用『公鑰』對簽名進行驗證
交易數據被廣播到比特幣網絡后,節點會對這個交易數據進行檢驗,其中就包括對簽名的校驗。如果校驗正確,那么這筆余額就成功地從“轉出錢包”轉移到“轉入錢包”了。
小結
如果一個『錢包地址』從未曾發送余額到其他『錢包地址』,那么它的『公鑰』是不會暴露在比特幣網絡上的。而公鑰生成算法(SECP256K1)是不可逆的,即使『公鑰』暴露,也很難對『私鑰』的安全性造成影響(難易取決于『私鑰』的生成算法)。
『私鑰』用來生成『公鑰』和『錢包地址』,也用來對交易進行簽名。擁有了『私鑰』就是擁有了對這個錢包余額的一切操作權力。所以,保護『私鑰』是所有比特幣錢包應用最基本也是最重要的功能。