來源|《商用區塊鏈技術與實踐》
責編 | 晉兆雨
頭圖 |付費下載於視覺中國
*文末有贈書福利
安全性是實現區塊鏈系統功能的基礎,也是目前阻礙區塊鏈應用推廣的因素之一。密碼學是資訊保安的基石,以很小的代價給資訊提供一種強有力的安全保護,廣泛應用於政治、經濟、軍事、外交和情報等重要領域。隨著近年來計算機網路和通訊技術迅猛發展,密碼學得到了前所未有的重視並迅速普及,同時應用領域也廣為拓展。本文主要講解密碼學在區塊鏈中的應用。
雜湊演算法
雜湊演算法(Hash Algorithms)也稱為雜湊演算法、雜湊演算法或數字指紋,是可以將任意長度的訊息壓縮為一個固定長度的訊息的演算法。雜湊演算法是區塊鏈技術體系的重要組成部分,也是現代密碼學領域的重要分支,在身份認證、數字簽名等諸多領域有著廣泛的應用。深刻理解雜湊演算法原理,對於區塊鏈系統的設計與實現有著至關重要的作用。
定義
雜湊演算法可以在極短的時間內,將任意長度的二進位制字串對映為固定長度的二進位制字串,輸出值稱為雜湊值(Hash Value)或者數字摘要(Digital Digest)。一般而言,雜湊函式的數學表達形式如下:
式中,為固定長度的輸出值;為任意長度的輸入值。任意輸入值(Message)的二進位制編碼經過雜湊函式計算後,可以得出n位元的一個0、1字串的雜湊值,在不同演算法中n的取值可能不同,例如128、160、192、256、384或512等。雜湊演算法在區塊鏈技術中得到了廣泛的應用,各個區塊之間透過雜湊指標連線形成區塊鏈,每個區塊的完整性檢驗將以雜湊運算的方式進行。
密碼學雜湊演算法的主要特性就是單向性,即在演算法上,只能從輸入值計算得到輸出值,而從輸出值計算得到輸入值是不可行的。因為雜湊演算法的輸出值是固定長度的,所以雜湊演算法存在一個碰撞的問題,即雜湊演算法的輸出值的長度為n位元,那麼,任取2n+1個不同的輸入值,就一定存在兩個不同的輸入值會得到相同的輸出值。因此,在一定數量的輸入值情況下,輸出值越長的雜湊演算法,其碰撞的概率會越小。
常用的雜湊演算法
常用的雜湊演算法包括MD系列演算法和SHA系列演算法,其中MD系列演算法有MD2、MD4、MD5、RIPEMD演算法等,SHA系列演算法有SHA0、SHA1、SHA2、SHA3演算法等。在雜湊演算法中,MD5演算法和SHA1演算法是應用最廣泛的,兩者的原理相差不大,但MD5演算法加密後的輸出值的長度為128位元,SHA1演算法加密後的輸出值的長度為160位元。在2004年的國際密碼學大會上,王小云教授介紹了對一系列雜湊演算法尋找實際碰撞的方法,並當場破解了包括MD4、MD5、HAVAL128演算法在內的多種雜湊演算法。2005年,王小云教授進一步最佳化了方案,對SHA0、SHA1演算法也成功地給出了碰撞攻擊。這些攻擊技術對當時雜湊演算法的安全性造成了很大威脅,但同時也促進了新的雜湊演算法的設計與研究。
1.MD系列演算法
MD系列演算法是一個應用非常廣泛的演算法集,最出名的MD5演算法由RSA公司的羅納德·林·李維斯特(Ronald L. Rivest)在1992年提出,目前被廣泛應用於資料完整性校驗、訊息摘要、訊息認證等。MD2演算法的運算速度較慢但相對安全,MD4演算法的運算速度很快,但安全性下降,MD5演算法比MD4演算法更安全、運算速度更快。雖然這些演算法的安全性逐漸提高,但均被王小云教授證明是不夠安全的。MD5演算法被破解後,Ronald L. Rivest在2008年提出了更完善的MD6演算法,但MD6演算法並未得到廣泛使用。
MD5演算法的設計採用了密碼學領域的Merkle-Damgard構造法,這是一類採用抗碰撞的單向壓縮函式來構造雜湊函式的通用方法。MD5演算法的基本原理是將資料資訊壓縮成128位元來作為資訊摘要,首先將資料填充至512位元的整數倍,並將填充後的資料進行分組,然後將每一分組劃分為16個32位元的子分組,該子分組經過特定演算法計算後,輸出結果是4個32位元的分組資料,最後將這4個32位元的分組資料級聯,生成一個128位元的雜湊值,即最終計算的結果。
2.SHA系列演算法
SHA(Secure Hash Algorithm,安全雜湊演算法)是美國國家標準技術研究所釋出的國家標準,規定了SHA1、SHA224、SHA256、SHA384和SHA512單向雜湊演算法。SHA1、SHA224和SHA256演算法適用於長度不超過264位元的訊息。SHA384和SHA512演算法適用於長度不超過2128位元的訊息。SHA系列演算法主要適用於數字簽名標準(Digital Signature Standard,DSS)裡面定義的數字簽名演算法(Digital Signature Algorithm,DSA)。對於長度小於264位元的訊息,SHA1演算法會產生一個160位元的訊息摘要。然而,SHA1演算法已被證明不具備“強抗碰撞性”。2005年,王小云教授破解了SHA1演算法,證明了160位元的SHA1演算法只需要大約269次計算就可以找到碰撞。
為了提高安全性,美國國家標準與技術研究院(National Institute of Standards and Technology,NIST)陸續釋出了SHA256、SHA384、SHA512以及SHA224演算法,統稱為SHA2演算法。這些演算法都是按照輸出雜湊值的長度命名的,例如SHA256演算法可將資料轉換成長度為256位元的雜湊值。雖然這些演算法的設計原理與SHA1演算法相似,但是至今尚未出現針對SHA2演算法的有效攻擊。因此,比特幣在設計之初即選擇採用了當時被公認為最安全和最先進的SHA256演算法,除了在生成比特幣地址的流程中有一個環節採用了RIPEMD160演算法,其他需要做雜湊運算的地方均採用了SHA256演算法或雙重SHA256演算法,例如計算區塊ID、計算交易ID、建立地址、PoW共識過程等。
SHA256演算法
在比特幣和以太坊的區塊鏈系統中,SHA256演算法是工作量證明演算法的基礎,具體的工作量證明演算法在後面的章節中詳細闡述。在比特幣系統中,工作量證明演算法只計算一次SHA256演算法,而在以太坊系統中,工作量證明演算法則巢狀計算兩次SHA256演算法。
常用的雜湊演算法的過程引數見表3-1。
表3-1
雜湊演算法
MD5
SHA1
SHA256
輸出值的長度(位元)
128
160
256
內部狀態值的長度(位元)
128
160
256
塊大小(位元)
512
512
512
計算迭代次數(次)
64
80
64
內部狀態值的長度直接影響最終的輸出值的長度,隨著雜湊演算法不斷演進,內部狀態值的長度不斷增加,對應的輸出值的長度也在不斷增加。只有不斷增加輸出值的長度,才能在演算法上增加破解的難度。隨著對雜湊演算法不斷深入地研究,慢慢會找到一些更加低廉的破解方案,這也促使我們不斷改進雜湊演算法的內部細節。我們已經發現了降低破解MD5、SHA1演算法難度的方案,所以目前MD5演算法與SHA1演算法的安全性大大降低了,已經不再推薦使用,現在更多的是用在檔案的校驗方面。目前,SHA256演算法還是比較安全的,但是也不排除在不遠的將來,我們會發現新的破解方案。
加密和解密演算法
雜湊演算法只是一種單向密碼體制,即它是一個從訊息到摘要的不可逆對映,只有正向過程,沒有逆向過程。在區塊鏈系統中,區塊鏈賬戶地址的生成、資料傳輸還會用到支援加密和解密的密碼體制。密碼體制分為對稱密碼體制和非對稱密碼體制。傳統的密碼學主要研究對稱加密,即在加密和解密的過程中使用相同的金鑰或規則,其優勢在於演算法公開、計算量小、加密速度快。然而,對稱加密需要傳送方和接收方共享同一把金鑰,因而難以實現有效的金鑰分發和安全儲存是其最大的缺點。同時,每一對傳送方和接收方都需要使用同一把金鑰,這在大規模通訊中將會產生大量金鑰,從而增加使用者在金鑰管理方面的負擔。
對稱密碼體制
對稱加密是對明文的資料按某種演算法處理,讓資料轉換為不可讀的資料(稱為“密文”),從而達到資料不被竊取和閱讀的目的。解密則相反,是將密文轉化為明文的過程。
一個密碼系統由密碼演算法和金鑰兩個基本元件構成。金鑰是隱私資料,由使用者自行保管,而演算法是公開的,任何人都使用同一種演算法。對稱加密的原理如圖3-1所示。對稱加密是一種變換,使用者A向使用者B傳送一份經過加密的訊息,傳輸給使用者B,使用者B收到訊息並逆向解密出原始的資訊。
在對稱密碼演算法早期的實際應用中,其金鑰分發曾經是一個難題。1976年,惠特菲爾德·迪菲(Whitfield Diffie)和馬丁·赫爾曼(MartinHellman)的論文《密碼學的新方向》(NewDirections in Cryptography)提出了Diffie-Hellman金鑰交換演算法,解決了對稱密碼演算法金鑰分發的問題。該論文同時指出,加密和解密可以使用不同的金鑰和規則,從而第一次使沒有共享金鑰的雙方能夠安全地通訊。這項劃時代的工作奠定了非對稱密碼體制的基礎。密碼學的研究熱潮使得利用密碼學來保護個人隱私和自由的觀念深入人心。同時,數字加密貨幣的初期研究也借勢蓬勃發展,誕生了密碼學匿名現金系統eCash、分散式電子加密貨幣B-money、雜湊現金HashCash等數字加密貨幣的雛形,為後期比特幣的誕生提供了實踐上的指導。
非對稱密碼體制
非對稱密碼體制的金鑰成對出現,分為公鑰和私鑰兩個部分,公鑰PK用於加密或驗證簽名,私鑰SK用於解密或簽名,只有解密者知道。兩個金鑰之間不能從公鑰推算出私鑰,用公鑰加密的資料只能使用對應的私鑰解密,用私鑰簽名的資料只能使用對應的公鑰驗證。非對稱加密的原理如圖3-2所示。使用者A使用使用者B的公鑰PK對明文P進行加密得到密文C,使用者B用自己的私鑰SK對密文C解密得到明文P。非對稱密碼系統與對稱密碼系統相比,不僅具有保密功能,同時也能實現金鑰分發和身份認證。基於數字簽名的身份認證是非對稱密碼系統的典型應用。在這個過程中,使用者A先用自己的私鑰SK對訊息M進行簽名得到S,隨後使用者B使用使用者A的公鑰PK對M、S進行驗證,來判斷S是否為使用者A對M的簽名。在一個典型的通訊系統中,訊息M是使用者B發給使用者A的一個隨機數,如果使用者A能夠用M和自己的私鑰SK計算出正確的簽名S,並透過使用者B的驗證,則使用者B可以確認使用者A的身份,否則使用者B將拒絕與使用者A進行後續的通訊。
非對稱密碼體制將加密和解密能力分開:多使用者加密的結果由一個使用者解密,可用於在公共網路中實現保密通訊;單使用者簽名的資訊可由多使用者驗證,可用於實現對使用者的身份認證。
ED25519演算法
ED25519演算法是由科學家、密碼學家丹尼爾·朱利葉斯·伯恩斯坦(Daniel Julius Bernstein)在2006年設計的與現有的任何橢圓曲線演算法都完全不同的橢圓曲線簽名演算法,可用於區塊鏈簽名。簽名過程不依賴隨機數生成器,不依賴雜湊函式的抗碰撞性,沒有時間通道攻擊的問題。
ED25519演算法屬於EDDSA演算法家族,使用Curve25519橢圓曲線引數,其簽名和驗證的效能都極高。在比特幣和以太坊系統中,簽名演算法使用的是ECDSA家族的Secp256k1橢圓曲線引數,表3-2為這兩個橢圓曲線演算法的特點對比。
表3-2
橢圓曲線演算法
Secp256k1(ECDSA演算法)
Curve25519(ED25519演算法)
私鑰長度(位元組)
32
32
公鑰長度(位元組)
33
32
簽名資料長度(位元組)
約70
64
引數輸入範圍(位元)
2128
2128
從表3-2基本資料的對比中可以看出,使用Secp256k1實現的ECDSA演算法和使用Curve25519實現的ED25519演算法的差別比較小。不同之處在於,ED25519演算法的重點放在了安全性上,其簽名的過程不依賴隨機函式,具備防雜湊碰撞特性,也沒有時間通道攻擊的危險。
區塊鏈技術經過11年的發展,已經逐漸走出數字貨幣等傳統應用範圍,逐漸向數字金融、物聯網、智慧製造、供應鏈管理等商業領域擴充套件。
目前,區塊鏈技術正處於大規模商業應用的前夜,我們非常有必要探討商用區塊鏈技術的技術進展和發展趨勢。