為什麼比特幣地址不直接使用公鑰,而需要通過哈希生成?為什麼每次付款都應該設置找零地址?
我們知道,每個人的比特別錢包中有多個比特幣地址,每個比特幣地址代表一定數量的比特幣。而比特幣地址是通過一個公鑰通過哈希(RPIEMD+SHA)生成的,這個公鑰又是由私鑰通過橢圓曲線(ECC)生成的。私鑰保存在比特幣錢包中,不應泄露出去。而公鑰在付款交易時,需要和比特幣地址一起,通過交易記錄公開發布,由區塊鏈系統驗證付款交易的有效性。
那麼,為什麼比特幣地址不直接使用公鑰呢?公鑰用來驗證私鑰的簽名,將它當做比特幣地址,不是更方便么!為什麼需要費事兒地再通過哈希生成一個比特幣地址呢?如果你弄明白這件事兒的原因,你就一定會感謝中本聰,把這麼一個奇巧無比的機制帶給我們!
請結合下圖理解,第一行是收款方她的比特幣錢包中一個她的比特幣地址(HerBitcoinAddr)。第二行是付款方我的比特幣錢包中一個我的比特幣(MyBitcoinAddr)。我要付款給她,那麼我生成的交易記錄如下灰色方框所示,含有我的公鑰(MyPubKey),我的比特幣地址(MyBitcoinAddr),她的比特幣地址(HerBitcoinAddr),還有付款信息和我通過我的私鑰進行的簽名(Signature)。
請注意,灰色方框中的交易記錄是公開的,也就是說,如果她只想收款,那麼她只需要公開她的比特幣地址(HerBitcoinAddr)即可,不需要公開其它任何信息。而我需要付款,那麼我除了公開我的比特幣地址(MyBitcoinAddr)以外,還需要公開我的公鑰(MyPubKey)和簽名(Signature)。
這說明了什麼呢?根據非對稱演算法(PKI)原理,從私鑰可以生成公鑰,但是從公鑰無法反推出私鑰。注意,「從公鑰無法反推出私鑰「這個表述並不正確!其實,從公鑰是可以反推出私鑰的,只是很難很難而已。現代智人認為,未來的量子計算機,是可以從公鑰反推出私鑰的。因此,在比特幣公開的交易記錄中包含付款人我的公鑰(MyPubKey),使得付款人我的這個比特幣地址(MyBitcoinAddr)中的錢是不安全的。
而對於收款方她的比特幣地址,因為她只公開了她的比特幣地址,而量子計算是無法通過哈希值復原原始內容的,就是無法通過她的比特幣地址復原她的公鑰的,從而更無法推出她的私鑰,所以可以認為她的比特幣地址是安全的。
那麼,作為付款人的我,當我付完錢之後,我的比特幣地址(MyBitcoinAddr)不就公開了么,不就不安全了么,該怎麼辦呢?正確的做法請見下圖,我每次付款的時候,都應該再提供一個找零地址(MyBitcoinAddr2),這個找零地址需要是我從未公開過它的公鑰(MyPubKey2)的比特幣地址,也就是我從未用它付過款。我在付款的時候,將付款用的比特幣地址(MyBitcoinAddr)中剩下的錢,都轉賬給我的找零地址(MyBitcoinAddr2)。
也就是說,每次付款,我的付款比特幣地址(MyBitcoinAddr)都作廢了,而錢分別轉移到收款人她的比特幣地址(HerBitcoinAddr)中,和我自己的找零地址(MyBitcoinAddr2)中。因為HerBitcoinAddr和MyBitcoinAddr2都從未付過款、公鑰都從未公開過,所以,即使量子計算時代降臨,這兩個比特幣地址中的錢還都是安全的。
再次感謝中本聰,把比特幣這麼一個奇思妙想的東西帶給我們!
Reference:
0. 老宋的獨家號
1.Open source P2P money
2.https://bitcoin.org/bitcoin.pdf
註:本文為老宋原創文章,轉載前請至【知乎專欄-老宋的獨家號】點贊或評論建議。
推薦閱讀:
※密碼學大事件!研究人員公布第一例SHA-1哈希碰撞實例
※對一堆文件中的每一個文件單獨加密,如果已知其中一些文件的明文和密文,是否會導致能推斷出密鑰?
※求大觸們推薦一些比較系統的關於密碼加密解密的書籍?
※存不存在一種匿名投票方式(計算機實現),滿足以下條件?
※密碼學 安全方向?
TAG:比特币Bitcoin | 区块链Blockchain | 密码学 |