比特幣所有權及隱私問題-非對稱加密應用

Tiny熊發表於2017-11-03

最新內容會更新在主站深入淺出區塊鏈社群
原文連結:比特幣所有權及隱私問題-非對稱加密應用

比特幣系統是如何確定某個賬戶的比特幣是屬於誰的?誰可以支付這個賬戶比特幣?
如果你對這個問題還不是很明白,那就一起來看看吧。

銀行系統

我們先來回顧下現實的銀行系統:

  1. 首先我們需要把我們的個人資訊(如身份證)給銀行,銀行給我們開立相對應的賬戶,銀行在開戶的時候確立了對賬戶的所有權。
  2. 進行支付的時候,銀行對交易雙方完成轉賬(銀行在開戶的時候已經知道我們對應的賬戶)。

同時銀行會對賬戶資訊進行保密(這點其實不能保證)。

匿名賬本

那麼比特幣如何在沒有第三方銀行的參與下,在確保隱私的同時如何確定賬戶所有權的呢?

實際上比特幣的賬戶是用地址來表示,賬本上不顯示個人資訊,轉賬是把比特幣從一個地址轉移到另一個地址。
轉賬記錄如這樣:

{
    "付款地址":"2A39CBa2390FDe"
    "收款地址":"AAC9CBa239aFcc"
    "金額":"0.2btc"
}

接下來問題就變為了 誰有權用某個地址進行付款。

支付和所有權 實際是同一個問題,如果此比特幣只有我可以用來支付,那麼說明我擁有所有權

地址與私鑰

比特幣的解決方案是,誰擁有某個地址的私鑰(如果完全沒有加密概念的人,可以簡單的把私鑰當作密碼),誰就能用這個地址進行支付。(所以私鑰一定保管好,如果私鑰洩漏,比特幣就可能丟失)

比特幣地址和私鑰是一個非對稱的關係,私鑰經過一序列運算(其中有兩次Hash)之後,可以得到地址, 但是無法從地址反推得到私鑰。

地址: 2A39CBa2390FDe
私鑰: sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgal

Hash(Hash(fun(sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgal)))  -> 2A39CBa2390FDe

銀行系統銀行賬號和密碼是完全獨立的,無法互相推導,轉出時需要同時驗證賬號和密碼

還是上面交易的例子:

{
    "付款地址":"2A39CBa2390FDe",
    "收款地址":"AAC9CBa239aFcc",
    "金額":"0.2btc"
}

只有擁有地址2A39CBa2390FDe的私鑰才能進行支付。

非對稱加密技術

這個時候問題就變為了,如何證明你擁有某個地址的私鑰(在不洩漏私鑰的情況下)。

對交易資訊進行簽名

實際在簽名之前,會先對交易資訊進行Hash運算的到摘要資訊,然後對摘要資訊進行簽名。過程大概是這樣:
1.對交易進行hash, 得到一個摘要資訊(Hash值)

hash('
    {"付款地址":"2A39CBa2390FDe",
    "收款地址":"AAC9CBa239aFcc",
    "金額":"0.2btc"
    }') -> 8aDB23CDEA6

2.用私鑰對交易摘要進行簽名(付款方在安全的環境下進行,以避免私鑰洩密), 用程式碼表示大概是這樣。

#引數1為交易摘要
#引數2為私鑰
#返回簽名資訊
sign("8aDB23CDEA6", "J78sknJhidhLIqdngalket") -> "3cdferdadgadg"

廣播

在簽名運算之後,付款節點就開始在全網進行廣播:我支付了0.2btc到AAC9CBa239aFcc,簽名資訊是3cdferdadgadg,你們來確認一下吧。

廣播過程實際上是發資訊到相連的其它節點,其它節點在驗證通過後再轉發到與之相連的節點,這樣的擴散過程。

廣播的資訊包含了交易原始資訊和簽名資訊

驗證

其它節點在收到廣播資訊之後,會驗證簽名資訊是不是付款方用私鑰對交易原始資訊簽名產生的,如果驗證通過說明確實是付款方本人發出的交易,說明交易有效,才會記錄到賬本中去。

驗證過程實際是簽名過程的逆運算,用程式碼表示大概過程是這樣的:

#引數1為簽名資訊
#引數2為付款方地址
#返回交易摘要
verify("3cdferdadgadg", "2A39CBa2390FDe") -> "8aDB23CDEA6"

如果驗證輸出的資訊和原始交易資訊的hash一致,則驗證通過,記錄賬本,用程式碼表示大概是這樣:

if(verify("3cdferdadgadg", "2A39CBa2390FDe")
    == hash('{"付款地址":"2A39CBa2390FDe",
              "收款地址":"AAC9CBa239aFcc",
              "金額":"0.2btc"}')) :
    # 寫入賬本 
    # 廣播
else:
   # donothing

大家可以理解為付款地址為公鑰,簽名過程即為用私鑰對交易摘要的加密過程,驗證過程為用公鑰解密的過程(為方便大家理解,嚴格來講是不準確的)。

補充說明

上面為了更好的理解,我對一些資訊進行了簡化。

比特幣系統使用了橢圓曲線簽名演算法,演算法的私鑰由32個位元組隨機陣列成,通過私鑰可以計算出公鑰,公鑰經過一序列雜湊演算法和編碼演算法得到比特幣地址,地址也可以理解為公鑰的摘要。

深入淺出區塊鏈 - 系統學習區塊鏈,打造最好的區塊鏈技術部落格

相關文章