(點選上方公號,快速關註我們)
作者:王奎,個人公號:不止思考
大家都知道,區塊鏈的關鍵技術組成主要為:P2P網路協議、共識機制、密碼學技術、賬戶與儲存模型。而這些技術中,又以 密碼學與共識機制 這兩點為最核心。那麼今天我們來詳細的聊一聊密碼學,看一看密碼學技術是如何在區塊鏈中應用的。
首先,我們需知道區塊鏈中用到的密碼學演演算法有哪些?其實就兩大類:
-
雜湊演演算法
-
非對稱加密演演算法
一、區塊鏈中的雜湊演演算法
雜湊演演算法是區塊鏈中用的最多的一種演演算法,它被廣泛的使用在構建區塊和確認交易的完整性上。
它是一類數學函式演演算法,又被稱為雜湊演演算法,需具備三個基本特性:
-
其輸入可為任意大小的字串
-
它產生固定大小的輸出
-
它能進行有效計算,也就是能在合理的時間內就能算出輸出值
如果要求雜湊演演算法達到密碼學安全的話,我們還要求它具備以下三個附加特性:
-
碰撞阻力:
是指對於兩個不同的輸入,必須產生兩個不同的輸出。如果對於兩個不同的輸入產生了相同的輸出,那麼就說明不具備碰撞阻力,或是弱碰撞阻力。 -
隱秘性:
也被稱為不可逆性,是指 y = HASH(x)中,透過輸入值x,可以計算出輸出值y,但是無法透過y值去反推計算出x值。為了保證不可逆,就得讓x的取值來自一個非常廣泛的集合,使之很難透過計算反推出x值。 -
謎題友好:
這個特性可以理解為,謎題是公平友好的,例如演演算法中 y = HASH(x),如果已知y值,想去得到x值,那就必須暴力列舉,不斷的嘗試才能做到,並且沒有比這更好的辦法,沒有捷徑。
雜湊演演算法有很多,比特幣主要使用的雜湊演演算法是 SHA-256 演演算法。
除此之外,還有其他一些雜湊演演算法也很流行,例如 MD5、SHA-1、SHA-2(SHA-224、SHA-256、SHA-384、SHA-512)、SHA-3 等,其中 MD5、SHA-1 已被證明瞭不具備 強碰撞阻力,安全性不夠高,因此市場上不再推薦使用。
我們以比特幣為例,來看一下雜湊演演算法的具體應用:
在比特幣中,使用雜湊演演算法把交易生成資料摘要,當前區塊裡麵包含上一個區塊的雜湊值,後面一個區塊又包含當前區塊的雜湊值,就這樣一個接一個的連線起來,形成一個雜湊指標連結串列,如下圖:
上面只是示意圖,那麼在實際比特幣系統中,每個區塊包含哪些內容呢:
重點關註一下上圖中的:
-
Prev Block:記錄簽一個區塊的hash地址,32位元組
-
Merkle Root:是一個記錄當前塊內的所有交易資訊的資料摘要hash值,32位元組
-
Nonce:一個隨機值,需要透過這個隨機值去找到滿足某個條件的hash值(挖礦),4位元組
上面只是解釋了幾個重點的欄位,其它欄位透過字面應該容易理解就不一一解釋了。
這所有的欄位一起就組成了 block essay-header(區塊頭),然後需要對 block essay-header 進行2次hash計算,計算完成的值就是當前比特幣區塊的hash值。因為比特幣系統要求計算出來的這個hash值滿足一定的條件(小於某個數值),因此需要我們不斷的遍歷Nonce值去計算新的hash值以滿足要求,只有找到了滿足要求的hash值,那麼這就是一個合法區塊了(這一系列動作也叫作挖礦)
python 示例: SHA-256(SHA-256 (Block Header)
我們再看一下上面的另一個重要欄位: Merkle tree 欄位。
Merkle tree 被稱為 默克爾樹,它也是雜湊演演算法的一個重要應用。
它其實是一個用雜湊指標建立的二叉樹或多叉樹。
Merkle tree 如圖:
其樹的頂端叫做 默克爾根(Merkle Root),Merkle Root 也是一個hash值,它是怎麼計算出來的呢?
比特幣中對每一筆交易做一個hash計算,然後把每2個交易的hash再進行合併做hash,如圖中的 交易A的hash值是 H(A),交易B的hash值是H(B),再對這2個交易合併hash後就是H(hA|hb),就這樣一直往上合併計算,算到最後的根部就是 Merkle Root 了。
在比特幣和以太坊中都是使用的默克爾樹結構,但是以太坊為了實現更多複雜的功能,所以有三個默克爾樹。
至此,區塊鏈中的雜湊演演算法應用就介紹完了,接下來我們看一下非對稱加密演演算法。
二、區塊鏈中的非對稱加密演演算法
區塊鏈中有一個很關鍵的點就是賬戶問題,但比特幣中是沒有賬戶概念的,那大家是怎麼進行轉賬交易的呢?
這裡就得先介紹區塊鏈中的非對稱加密技術了。
非對稱加密技術有很多種,如:RSA、ECC、ECDSA 等,比特幣中是使用的 ECDSA 演演算法。
ECDSA 是美國政府的標準,是利用了橢圓曲線的升級版,這個演演算法經過了數年的細緻密碼分析,被廣泛認為是安全可靠的。
所謂非對稱加密是指我們在對資料進行加密和解密的時候,需使用2個不同的金鑰。比如,我們可以用A金鑰將資料進行加密,然後用B金鑰來解密,相反,也可以用B來加密,然後使用A來解密。那麼如果我想給某個人傳遞資訊,那我可以先用A加密後,將密文傳給她,她拿到密文之後,用手上的B金鑰去解開。這2個金鑰,一個被成為公鑰、一個是私鑰。
在比特幣中,每個使用者都有一對金鑰(公鑰和私鑰),比特幣系統中是使用使用者的公鑰作為交易賬戶的。
我們先看下圖:
在圖中可以看到,在第一筆交易記錄中,是 使用者U0 來發起的交易,要將代幣支付給 使用者U1,是怎麼實現的呢?
-
首先 使用者U0 寫好交易資訊:data(明文,例如:使用者U0轉賬100元給使用者U1)
-
使用者U0 使用雜湊演演算法將交易資訊進行計算,得出 H = hash(data),然後再使用自己的私鑰對 H 進行簽名,即 S(H),這一步其實是為了防止交易資訊被篡改用的
-
然後基於區塊鏈網路,將 簽名S(H) 和 交易資訊data 傳遞給 使用者U1
-
使用者U1 使用 使用者U0 的公鑰 來對 S(H) 解密,就得到了交易資訊的雜湊值 H
-
同時,使用者U1 還使用雜湊演演算法對 交易資訊data 進行計算,得出 H2 = hash(data)
-
對比上面2個雜湊值,如果 H1==H2,則交易合法。說明 使用者U0 在發起交易的時候確實擁有真實的私鑰,有權發起自己賬戶的交易
-
網路中每一個節點都可以參與上述的驗證步驟。
這個示例,就是比特幣中一次交易的簽名流程,即將 雜湊演演算法與非對稱演演算法結合在一起用於了比特幣交易的數字簽名。
除此之外,比特幣中,公私鑰的生成、比特幣地址的生成也是由非對稱加密演演算法來保證的。
以上,就是區塊鏈體系中,核心技術之雜湊演演算法與加密演演算法的應用情況,歡迎一起交流。
【關於作者】
王奎:不止思考的技術人,一名駐紮在武漢網際網路的程式員老兵,我有一個公眾號 bzsikao 平時寫一些工作的心得和技術文章。
【關於投稿】
如果大家有原創好文投稿,請直接給公號傳送留言。
① 留言格式:
【投稿】+《 文章標題》+ 文章連結
② 示例:
【投稿】《不要自稱是程式員,我十多年的 IT 職場總結》:http://blog.jobbole.com/94148/
③ 最後請附上您的個人簡介哈~
覺得本文有幫助?請分享給更多人
關註「演演算法愛好者」,修煉程式設計內功