01-BTC-密碼學原理

聲明:本文是要點筆記,介紹和系列筆記均收錄在專題:區塊鏈技術與應用

比特幣被稱爲加密貨幣(crypto-currency)。

區塊鏈上內容都是公開的,包括區塊的地址,轉賬的金額。

比特幣主要用到密碼學中的兩個功能:哈希簽名。下面我們來一一介紹。

哈希

密碼學中用到的哈希函數被成爲 cryptographtic hash function。

哈希函數主要有三個特性:

  1. 碰撞特性(collision resistance);
  2. 隱祕性(Hiding);
  3. 謎題友好(puzzle friendly)。

1. 碰撞特性(collision resistance)

也稱哈希碰撞,例如 x≠y H(x)=H(y) 兩個不同的輸入,輸出卻是相等的,就稱做哈希碰撞。它是不可避免的,因爲輸入空間(x 取值無限多)總大於輸出空間。很難給出 x,來找到 y,除非蠻力求解(brute-force)。

該性質的作用:對一個 message 求 digest。比如 message 取 m,m 的哈希值是 H(m)=digest。如果有人想篡改 m 值,而 H(m) 不變,則無法做到。哈希碰撞無法人爲製造,無法驗證,是根據實踐經驗得來的。

2. 隱祕性(Hiding)

說的是,哈希函數的計算過程是單向的,不可逆的,即從 H(x) 無法推導出 x。hiding 性質前提是輸入空間足夠大,分佈比較均勻。如果不是足夠大,一般在 x 後面拼接一個隨機數 nonce,如 H(x||nonce)。

該性質的作用:和碰撞特性(collision resistance) 結合在一起,用來實現數據保證(digital commitment)(又稱爲 digital equivalent of a sealed envelope)

把預測結果作爲輸入 x,算出一個哈希值,將哈希值公佈,hiding 讓人們知道哈希值而不知道預測值,最後再將 x 公佈,因爲有哈希碰撞(collision resistance) 的性質,預測結果是不可篡改的。

3. 謎題友好(puzzle friendly)

除了密碼學中要求的以上兩個性質外,這個性質是比特幣中用到哈希函數的第三個性質。
說的是,哈希值的預算事先是不可預測的。假如哈希值是 00...0XX...X,我們事先是無法知道哪個值更容易算出這個結果,還是要一個一個帶入(尋找 nonce 值的過程)。

比特幣挖礦的過程中實際就是找一個 nonce,nonce 跟區塊的塊頭裏的其他信息合一起作爲輸入,得出的哈希值要小於等於某個指定的目標預值,即 H(block header)≤target 。block header,指的是區塊頭,區塊頭裏包含很多域(字段),其中有一個域是我們可以設置的隨機數 nonce,挖礦的過程就是不停的試隨機數,使得 block header 取哈希後落在指定的範圍之內。

所以,謎題友好(puzzle friendly)想指出的是挖礦過程中沒有捷徑,爲了使輸出值落在指定範圍,只能一個一個去試。而這個過程在比特幣中就被稱作爲工作量證明(proof of work)。總之,挖礦很難,驗證很容易(difficult to solve ,but easy to verify)。

比特幣中用的哈希函數叫作 SHA-256(secure hash algorithm ) 以上三個性質它都是滿足的。

簽名

在比特幣中,開賬戶、交易等都需要簽名。

在比特幣系統中開賬戶:在本地創立一個公私鑰匙對(public key ,private key),這就是一個賬戶。公私鑰匙對是來自於非對稱的加密技術(asymmetric encryption algorithm)。

對稱加密

兩人之間信息的交流可以利用密鑰(encryption key),A 將信息加密後發給 B,B 收到後用密鑰解密,因爲加密和解密用的是同一個密鑰,所以叫對稱加密。對稱加密的前提是有渠道可以安全地把密鑰分發給通訊的雙方。因此對稱加密的缺點就是密鑰的分發不方便,因爲在網絡上很容易被竊聽。

非對稱密鑰

非對稱密鑰是用一對密鑰而不是一個,加密用公鑰,解密用私鑰,加密和解密用的都是接收方的公鑰和私鑰。公鑰是不用保密的,私鑰要保密但是私鑰只要保存在本地就行,不用傳給對方。公鑰相當於銀行賬號,別人轉賬只要知道公鑰就行,私鑰相當於賬戶密碼,知道私鑰可以把賬戶上錢轉走。公鑰和私鑰是用來簽名。

假如 A 想向 B 轉 10 個比特幣,A 把交易放在區塊鏈上,別人怎麼知道這筆交易是 A 發起的呢?這就需要 A 要用自己的私鑰給交易簽名,其他人收到這筆交易後,要用 A 的公鑰去驗證簽名。簽名用私鑰,驗證用公鑰,用的仍然是同一個人的。創建賬戶產生相同公私鑰的可能性微乎其微,所以大量創建賬戶來竊取其他人賬戶是不可行的。

產生好的公私鑰前提是有一個好的隨機源(a good source of randomness),產生公私鑰是隨機的,如果隨機源不好,就有可能產生相同的公私鑰。比特幣中用的簽名算法,不僅是生成公私鑰的時候要有好的隨機源,之後每一次簽名時也要有好的隨機源。只要有一次簽名用的隨機源不好的話,就有可能泄露私鑰。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章