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