區(qū)塊鏈技術(shù)的基石密碼學(xué)探討
前言:談區(qū)塊鏈離不開密碼學(xué)。通常來講,區(qū)塊鏈技術(shù)是利用塊鏈?zhǔn)綌?shù)據(jù)結(jié)構(gòu)來驗證與存儲數(shù)據(jù)、利用分布式節(jié)點公式算法來生成和更新數(shù)據(jù)、利用密碼學(xué)的方式保證數(shù)據(jù)傳輸和訪問的安全、利用由自動化腳本代碼組成的智能合約來編程和操作數(shù)據(jù)的一種全新的分布式基礎(chǔ)架構(gòu)與計算范式。區(qū)塊鏈的核心是它按照時間順序?qū)?shù)據(jù)區(qū)塊以順序相連的方式組合成的一種鏈?zhǔn)綌?shù)據(jù)結(jié)構(gòu),并以密碼學(xué)方式保證的不可篡改和不可偽造的分布式賬本。我們對此做一個總結(jié),可以發(fā)現(xiàn)區(qū)塊鏈中有四項不可缺的核心技術(shù),分別是分布式存儲、共識機制、密碼學(xué)原理和智能合約。而今天我們將主要從密碼學(xué)的角度聊一聊區(qū)塊鏈的起源問題。
密碼學(xué)作為一門古老的學(xué)科,有著悠久而奇妙的歷史。它用于保護軍事和外交通信可追溯到幾千年前文字剛剛產(chǎn)生的上古時期。幾千年來,密碼學(xué)一直在不斷地向前發(fā)展。而隨著當(dāng)今信息時代的高速發(fā)展,密碼學(xué)的作用也越來越顯得重要。它已不僅僅局限于使用在軍事、政治和外交方面,而更多的是與人們的生活息息相關(guān):如人們在進行網(wǎng)上購物,與商務(wù)交流,使用信用卡等等,都需要密碼學(xué)的知識來保護人們的個人信息和隱私,當(dāng)然對于我們關(guān)注的區(qū)塊鏈技術(shù),密碼學(xué)作為其基石而存在。
凱撒(Caesar)是第一個把替換密碼用于軍事用途、并且記錄下來的人。在他的那本歌頌自己豐功偉績的《高盧記》里,凱撒描述了他把密信送到正處于圍困之中、瀕臨投降的西塞羅手中。凱撒非常喜歡使用密文,后世的《凱撒傳》詳細地記錄了凱撒使用的一種密文。而這種加密方法,甚至沿用到今天。
凱撒密碼的表示方法是:將每個字母,用字母表中這個字母之后三位的那個字母替代。它是一種替換加密的技術(shù),明文中的所有字母都在字母表上向后(或向前)按照一個固定數(shù)目進行偏移后被替換成密文。例,當(dāng)偏移量是3的時候,所有的字母A將被替換成D,B變成E,以此類推。也就是字母A用字母D替代,字母B用字母E替代。比如Abroad,凱撒在用密文寫信的時候,就被替換為Deurdg。這樣就得到了敵人看不懂的密文。
假如有這樣一條指令:RETURN TO ROME
用愷撒密碼加密后就成為:UHWXUQ WR URPH
如果這份指令被敵方截獲,也將不會泄密,因為字面上看不出任何意義。
現(xiàn)在看來這種加密方式可能稍顯幼稚,但作為歷史上文字記載的最早使用加密密鑰的案例:由發(fā)件人和收件人共享加密密鑰,標(biāo)志了現(xiàn)代密碼學(xué)的發(fā)端。可以說,從凱撒密碼,到20世紀(jì)公共密鑰被發(fā)明之前的這幾千年時間里,密碼學(xué)的原理都是一樣的。比特幣和區(qū)塊鏈的加密方式,跟凱撒密碼的原理區(qū)別,也就是多了公鑰而已。直到今天,我們在看很多諜戰(zhàn)片的時候,會發(fā)現(xiàn)不少特工和間諜還是采取這種方式傳輸情報。
這里有幾個術(shù)語,需要特別指出。密碼學(xué)家通常講用來書寫原始信息的字母表,也就是正常的字母表,稱為明碼表;而用來替換明碼字母的稱為密碼表。這也是密碼這個詞的來歷。那么往后移動三位,這個“三”則被稱為密鑰。當(dāng)然,學(xué)過數(shù)學(xué)的人都明白,這里有26個字母,僅僅按照順序移動,每個字母就有25個不同的替代方式,即25種密鑰,要是把字母順序打亂,密鑰就更多了。算法則是通過各種嘗試,破譯密碼的過程。
可以想象,在公元前100年左右,也就是相當(dāng)于中國的西漢時期,要想破譯凱撒的密碼,那可能性幾乎為零。在密碼學(xué)中,愷撒密碼是一種最簡單且最廣為人知的加密技術(shù)。愷撒密碼還在現(xiàn)代的ROT13系統(tǒng)中被應(yīng)用。但是和所有的利用字母表進行替換的加密技術(shù)一樣,愷撒密碼非常容易被破解,而且在實際應(yīng)用中也無法保證通信安全。
最早的古典密碼體制主要包含單表代換密碼體制和多表代換密碼體制。作為古典密碼中的兩種重要體制,一直在古代歷史上的全球各個區(qū)域廣泛地被使用。凱撒密碼就是一種典型的單表代換密碼。
單表代換密碼在長達一千年的時間里,被認為是無法破解的,因為存在著數(shù)量龐大的密鑰,依靠手工是根本計算不過來的。但是隨著社會的發(fā)展和技術(shù)的進步,來自東方的阿拉伯人,找到了更新的技術(shù),從而發(fā)現(xiàn)了一條捷徑來破獲這個被認為是無解的密碼,這次勝利是由阿拉伯世界的語言學(xué)家、統(tǒng)計學(xué)家和宗教學(xué)家三者共同完成的。
這還要間接感謝中國的造紙術(shù)的發(fā)明,伊斯蘭文明得以快速傳播。因為書籍需求量大增,那么就需要有人來校對,最能勝任這個工作的自然是神學(xué)家。他們在校對的同時,還在統(tǒng)計默罕默德啟示錄的用詞頻率,如果這個啟示錄出現(xiàn)了新詞,那么它出現(xiàn)的年份肯定就更往后等等。在梳理的過程中,他們也順道發(fā)現(xiàn)了一些字母出現(xiàn)的頻率就是比其他的字母要高得多。
學(xué)習(xí)過英語的我們知道,字母e是最常見的,其次是字母t和a。如果按照凱撒密碼加密,一個密碼字母對應(yīng)明碼字母,那么密碼字母中出現(xiàn)次數(shù)最多的很有可能就應(yīng)該對應(yīng)明碼字母E,以此類推,很容易就可以排除掉大量的密鑰,從而快速地找到正確的破譯方法?,F(xiàn)在無法考證究竟是誰把字母出現(xiàn)的頻率和破譯密碼聯(lián)系在了一起,但是可以肯定的是,公元九世紀(jì)的時候,阿拉伯人就已經(jīng)非常擅長破譯凱撒密碼了。
阿拉伯人從公元7世紀(jì)到公元12世紀(jì)期間,建立了輝煌燦爛的文明,相比較而言,歐洲當(dāng)時還是愚昧落后貧窮的地方。伊斯蘭文明的繁盛,不僅帶來了藝術(shù)、科學(xué)等文化的繁榮,社會的統(tǒng)治和管理也是非常有條理和高效的。當(dāng)時的管理者,不僅在政府的關(guān)鍵事務(wù)上進行加密,而且記錄稅收的時候也采用了密碼術(shù),他們在《大臣手冊》等管理文獻里還在探討與密碼術(shù)有關(guān)的技術(shù)性問題。正是因為有了巨大的需求,再加上科學(xué)技術(shù)的進步,阿拉伯人終于有機會破譯替換密碼這道千年難題。
單表代換的破譯十分簡單,因為在單表代換下,除了字母名稱改變以外,字母的頻度、重復(fù)字母模式、字母結(jié)合方式等統(tǒng)計特性均未發(fā)生改變,依靠這些不變的統(tǒng)計特性就能破譯單表代換。相對單表代換來說,多表代換密碼的破譯要難得多。
多表代換大約是在1467年左右由佛羅倫薩的建筑師Alberti發(fā)明的。多表代換密碼又分為非周期多表代換密碼和周期多表代換密碼。在一個多表替換密碼中,會使用多個字母作為密碼。為了加快加密或解密速度,所有的字母通常寫在一張表格上,密碼學(xué)上稱作tableau。這種表格通常是26×26,因為這樣才能放下全部26個英文字母。填充表格及選擇下次使用的字母的方法,就是不同多字母替換密碼之間的定義。多字母替換密碼比單字母更難打破,因為其替換可能性多,密文要較長才可。
其中最著名的一種為貝拉索于1585年推出的維吉尼亞密碼。它于1863年之前一直未被破解。法國人稱它作“不能破譯的密碼”(法語:le chiffre indéchiffrable)。此密碼曾被誤以為由布萊斯·德·維吉尼亞所創(chuàng),所以才叫作維吉尼亞密碼。
維吉尼亞密碼中,表格的第一行只需直接填上26個字母,然后以下每一行的字母都是向左偏移一格。(這叫作表格橫移,數(shù)學(xué)上每一列同余26。)要用這種密碼需要使用一個關(guān)鍵字來作為密鑰。關(guān)鍵字每次用完就再次重復(fù)。假設(shè)關(guān)鍵字是“CAT”,明文的第一個字由“C”加密,第二個字由“A”加密,第三個則由“T”加密,然后再回到C加密,一直重復(fù)。然后按照右邊的密碼表加密,例如BALL用CAT作關(guān)鍵字時會加密至DAEN,可見即使是同一個“L”亦會加密至另一個字母。現(xiàn)實中,維吉尼亞密碼的關(guān)鍵字非常長。
非周期多表代換密碼,對每個明文字母都采用不同的代換表(或密鑰),稱作一次一密密碼,只要加密表夠長,這是一種在理論上唯一不可破的密碼。這種密碼可以完全隱蔽明文的特點,但由于需要的密鑰量和明文消息長度相同而難于廣泛使用。為了減少密鑰量,在實際應(yīng)用當(dāng)中多采用周期多表代換密碼。在16世紀(jì),有各種各樣的多表自動密鑰密碼被使用,最矚目的當(dāng)屬法國人B.de?Vigtnère的Vigenère密碼體制。有名的多表代換密碼有Vigenère、Beaufort、Running-Key、Vernam和轉(zhuǎn)輪機(rotor?machine)。對于單表代換和多表代換密碼來說,唯密文分析是可行的。單表代換和多表代換密碼都是以單個字母作為代換對象的,而每次對多個字母進行代換就是多字母代換密碼。大約1854年L.Playfair在英國推廣Playfair密碼,它是由英國科學(xué)家C.Wheatstone發(fā)明的。這是第一種多字母代換密碼,在第一次世界大戰(zhàn)中英國人就采用這種密碼。多字母代換的優(yōu)點是容易將字母的自然頻度隱蔽或均勻化而有利于抵抗統(tǒng)計分析。這種密碼主要有Playfair密碼、Hill密碼等。
到二十世紀(jì)二十年代,人們發(fā)明了各種機械加密設(shè)備用來自動處理加密。大多數(shù)是基于轉(zhuǎn)輪的概念。1918年美國人E.H.Hebern造出了第一臺轉(zhuǎn)輪機,它是基于一臺用有線連接改造的早期打字機來產(chǎn)生單字母表替代的,輸出是通過原始的亮燈式指示。最著名的轉(zhuǎn)輪裝置是Enigma,它是由德國人Scherbius發(fā)明并制造的。它在第二次世界大戰(zhàn)中由德國人使用。不過在第二次世界大戰(zhàn)期間,它就被破譯了。
【近代密碼學(xué)】
近代密碼學(xué)研究信息從發(fā)端到收端的安全傳輸和安全存儲,是研究“知己知彼”的一門科學(xué)。其核心是密碼編碼學(xué)和密碼分析學(xué)。前者致力于建立難以被敵方或?qū)κ止テ频陌踩艽a體制,即“知己”;后者則力圖破譯敵方或?qū)κ忠延械拿艽a體制,即“知彼”。人類有記載的通信密碼始于公元前400年。古希臘人是置換密碼的發(fā)明者。1881年世界上的第一個電話保密專利出現(xiàn)。電報、無線電的發(fā)明使密碼學(xué)成為通信領(lǐng)域中不可回避的研究課題。
在第二次世界大戰(zhàn)初期,德國軍方啟用“恩尼格瑪”密碼機,盟軍對德軍加密的信息有好幾年一籌莫展,“恩尼格瑪”密碼機似乎是不可破的。但是經(jīng)過盟軍密碼分析學(xué)家的不懈努力,“恩尼格瑪”密碼機被攻破,盟軍掌握了德軍的許多機密,而德國軍方卻對此一無所知。
太平洋戰(zhàn)爭中,美軍破譯了日本海軍的密碼機,讀懂了日本艦隊司令官山本五十六發(fā)給各指揮官的命令,在中途島徹底擊潰了日本海軍,導(dǎo)致了太平洋戰(zhàn)爭的決定性轉(zhuǎn)折,而且不久還擊斃了山本五十六。相反軸心國中,只有德國是在第二次世界大戰(zhàn)的初期在密碼破譯方面取得過輝煌的戰(zhàn)績。因此,我們可以說,密碼學(xué)在戰(zhàn)爭中起著非常重要的作用。
編碼密碼學(xué)主要致力于信息加密、信息認證、數(shù)字簽名和密鑰管理方面的研究。信息加密的目的在于將可讀信息轉(zhuǎn)變?yōu)闊o法識別的內(nèi)容,使得截獲這些信息的人無法閱讀,同時信息的接收人能夠驗證接收到的信息是否被敵方篡改或替換過;數(shù)字簽名就是信息的接收人能夠確定接收到的信息是否確實是由所希望的發(fā)信人發(fā)出的;密鑰管理是信息加密中最難的部分,因為信息加密的安全性在于密鑰。歷史上,各國軍事情報機構(gòu)在獵取別國的密鑰管理方法上要比破譯加密算法成功得多。
密碼分析學(xué)與編碼學(xué)的方法不同,它不依賴數(shù)學(xué)邏輯的不變真理,必須憑經(jīng)驗,依賴客觀世界覺察得到的事實。因而,密碼分析更需要發(fā)揮人們的聰明才智,更具有挑戰(zhàn)性。
現(xiàn)代密碼學(xué)是一門迅速發(fā)展的應(yīng)用科學(xué)。隨著因特網(wǎng)的迅速普及,人們依靠它傳送大量的信息,但是這些信息在網(wǎng)絡(luò)上的傳輸都是公開的。因此,對于關(guān)系到個人利益的信息必須經(jīng)過加密之后才可以在網(wǎng)上傳送,這將離不開現(xiàn)代密碼技術(shù)。
1976年Diffie和Hellman在《密碼新方向》中提出了著名的D-H密鑰交換協(xié)議,標(biāo)志著公鑰密碼體制的出現(xiàn)。?Diffie和Hellman第一次提出了不基于秘密信道的密鑰?分發(fā),這就是D-H協(xié)議的重大意義所在。
PKI(Public Key Infrastructure)是一個用公鑰概念與技術(shù)來實施和提供安全服務(wù)的具有普適性的安全基礎(chǔ)設(shè)施。PKI公鑰基礎(chǔ)設(shè)施的主要任務(wù)是在開放環(huán)境中為開放性業(yè)務(wù)提供數(shù)字簽名服務(wù)。
二十世紀(jì)六七十年代以來計算機和通信系統(tǒng)的普及,帶動了個人對數(shù)字信息保護及各種安全服務(wù)的需求。IBM的Feistel在七十年代初期開始其工作,到1977年達到頂點:其研究成果被采納成為加密非分類信息的美國聯(lián)邦信息處理標(biāo)準(zhǔn),即數(shù)據(jù)加密標(biāo)準(zhǔn)DES,歷史上最著名的密碼體制。
1977年,美國國家標(biāo)準(zhǔn)局公布實施了“美國數(shù)據(jù)加密標(biāo)(DES)”,軍事部門壟斷密碼的局面被打破,民間力量開始全面介入密碼學(xué)的研究和應(yīng)用中。民用的加密產(chǎn)品在市場上已有大量出售,采用的加密算法有DES、IDEA、RSA等。
DES至今依然是世界范圍內(nèi)許多金融機構(gòu)進行安全電子商務(wù)的標(biāo)準(zhǔn)手段,是迄今為止世界上最為廣泛使用和流行的一種分組密碼算法。然而,隨著計算機硬件的發(fā)展及計算能力的提高,DES已經(jīng)顯得不再安全。1997年7月22日電子邊境基金學(xué)會(EFF)使用一臺25萬美金的電腦在56小時內(nèi)破譯了56位DES。1998年12月美國決定不再使用DES。美國國家標(biāo)準(zhǔn)技術(shù)研究所(NIST)現(xiàn)在已經(jīng)啟用了新的加密標(biāo)準(zhǔn)AES,它選用的算法是比利時的研究成果“Rijndael”。以上這兩個階段所使用的密碼體制都稱為是對稱密碼體制,因為這些體制中,加秘密鑰和解秘密鑰都是相同的,而進入密碼學(xué)發(fā)展的第三個階段,則出現(xiàn)了非對稱密碼體制——公鑰密碼體制。
現(xiàn)有的密碼體制千千萬萬,各不相同。但是它們都可以分為私鑰密碼體制(如DES密碼)和公鑰密碼(如公開密鑰密碼)。前者的加密過程和脫密過程相同,而且所用的密鑰也相同;后者,每個用戶都有公開秘密鑰。
【多鏈與非對稱加密】
對稱加密指的就是加密和解密使用同一個秘鑰,所以叫做對稱加密。對稱加密只有一個秘鑰,作為私鑰。 常見的對稱加密算法:DES,AES,3DES等等。
非對稱加密指的是:加密和解密使用不同的秘鑰,一把作為公開的公鑰,另一把作為私鑰。公鑰加密的信息,只有私鑰才能解密。私鑰加密的信息,只有公鑰才能解密。 常見的非對稱加密算法:RSA,ECC。
非對稱加密算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,如果用公開密鑰對數(shù)據(jù)進行加密,只有用對應(yīng)的私有密鑰才能解密;如果用私有密鑰對數(shù)據(jù)進行加密,那么只有用對應(yīng)的公開密鑰才能解密。因為加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法。 非對稱加密算法實現(xiàn)機密信息交換的基本過程是:甲方生成一對密鑰并將其中的一把作為公用密鑰向其它方公開;得到該公用密鑰的乙方使用該密鑰對機密信息進行加密后再發(fā)送給甲方;甲方再用自己保存的另一把專用密鑰對加密后的信息進行解密。
另一方面,甲方可以使用乙方的公鑰對機密信息進行簽名后再發(fā)送給乙方;乙方再用自己的私匙對數(shù)據(jù)進行驗簽。甲方只能用其專用密鑰解密由其公用密鑰加密后的任何信息。 非對稱加密算法的保密性比較好,它消除了最終用戶交換密鑰的需要。
非對稱密碼體制的特點:算法強度復(fù)雜、安全性依賴于算法與密鑰但是由于其算法復(fù)雜,而使得加密解密速度沒有對稱加密解密的速度快。對稱密碼體制中只有一種密鑰,并且是非公開的,如果要解密就得讓對方知道密鑰。所以保證其安全性就是保證密鑰的安全,而非對稱密鑰體制有兩種密鑰,其中一個是公開的,這樣就可以不需要像對稱密碼那樣傳輸對方的密鑰了。這樣安全性就大了很多。
在EKT中,我們就使用了公私鑰結(jié)合的非對稱加密和路由策略的機制實現(xiàn)拜占庭容錯。我們EKT的多鏈,采用“多鏈分而治之”的新方案重新設(shè)計了一個保障每個合約都能正常運行的公鏈,其中就使用到了非對稱加密對用戶的信息進行保存,同時主鏈和子鏈信息共享但是功能隔離。這一創(chuàng)新極大程度上簡化了架構(gòu),降低了數(shù)據(jù)處理壓力,確保一條鏈上流量激增不會影響到另一條鏈的效率,在鏈上進行的任何業(yè)務(wù)都不會收到其他業(yè)務(wù)干擾,有效實現(xiàn)了資源隔離。
在EKT中Token鏈?zhǔn)且粋€并行多鏈的結(jié)構(gòu),多鏈多共識,共享用戶基礎(chǔ)。EKT的Token是鏈上的一個屬性,就像使用了utxo模型的鏈utxo有其他Token一樣,我們的轉(zhuǎn)賬事件也是內(nèi)置的。
其實EKT解決的一個核心問題是,目前Dapp的開發(fā)難度的問題如果使用以太坊的Solidity開發(fā),需要學(xué)習(xí)以太坊的一整套邏輯,在復(fù)雜應(yīng)用開發(fā)的時候需要考慮各種優(yōu)化方案,同一個功能使用傳統(tǒng)C/S結(jié)構(gòu)一天寫完的,用以太坊可能要寫幾周時間,對開發(fā)者來說很不友好。
例如針對C/S模型,要寫一個非對稱加密服務(wù)需要:
1. 設(shè)計一個服務(wù)端,可以計算出一對秘鑰pub/pri。將私鑰保密將公鑰公開。
2. 設(shè)計一個客戶端請求服務(wù)端時,拿到服務(wù)端的公鑰pub。
3. 客戶端通過AES計算出對稱加密的秘鑰X。 然后使用pub將X進行加密。
4. 客戶端將加密后的密文發(fā)送給服務(wù)端。服務(wù)端通過pri解密獲得X。
5. 最后還要設(shè)計兩邊通訊機制,通過對稱密鑰X以對稱加密算法來加解密。
這一套流程若要Dapp/公鏈開發(fā)者寫出來,勢必在真正開發(fā)區(qū)塊鏈功能之前就已經(jīng)被這些繁瑣但其實通用的步驟耗費過多精力和資源。
EKT的中心思想就是設(shè)計一個社區(qū)的機制,讓開發(fā)者可以輕易的開發(fā)一個可以承載DAPP的主鏈,其他的交給EKT來處理, EKT 的“一鏈一主幣,多鏈多共識”的機制為后來的區(qū)塊鏈項目開發(fā)提供了很大的便利,可以使用于任何區(qū)塊鏈適用的應(yīng)用場景。
EKT 提供了一套底層的區(qū)塊鏈機制,其他的區(qū)塊鏈項目可以很容易的基于 EKT 的主鏈代碼部署一套自己的主鏈。在EKT上編寫的區(qū)塊鏈項目將無需過于擔(dān)心安全性問題,因為每一個接口都是非常簡單并且在許多條并行主鏈上部署和運行的。部署主鏈時可以靈活的發(fā)行自己主鏈的代幣以及選擇共識算法。新部署的主鏈也可以加入到 EKT 的整個生態(tài),共享 EKT 生態(tài)的用戶資源,代幣也可以和EKT 主幣以及其他主鏈的代幣進行交換和流通。
EKT主鏈上每個DPoS節(jié)點的公鑰都是公開的。這是一種兼顧效率、安全和去中心化的解決方案。Token現(xiàn)在一般被定義成一個智能合約,但如果把它變成一個預(yù)先定義好事件的“對象”,這個“對象”可以有自己的參數(shù)(比如總量、共識機制等等),則會帶來更好的安全體驗。接受token的地址可以有兩種:普通的用戶地址和合約地址,合約地址收到token之后可以執(zhí)行非圖靈完備的合約語言,進行簡單的狀態(tài)計算和token轉(zhuǎn)移。
【失靈的SHA-1】
區(qū)塊鏈玩家應(yīng)該都對一個詞非常的熟悉——哈希Hash,一般學(xué)術(shù)界翻譯做“散列”,程序員直接音譯為“哈?!?,它的操作是把任意長度的輸入(又叫做預(yù)映射pre-image)通過散列算法變換成固定長度的輸出,該輸出就是散列值。這種轉(zhuǎn)換是一種壓縮映射,也就是,散列值的空間通常遠小于輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來確定唯一的輸入值。
簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數(shù) 所有散列函數(shù)都有一個基本特性:如果兩個散列值是不相同的(根據(jù)同一函數(shù)),那么這兩個散列值的原始輸入也是不相同的。這個特性是散列函數(shù)具有確定性的結(jié)果,具有這種性質(zhì)的散列函數(shù)稱為單向散列函數(shù)。
但另一方面,散列函數(shù)的輸入和輸出不是唯一對應(yīng)關(guān)系的,如果兩個散列值相同,兩個輸入值很可能是相同的,但也可能不同,這種情況稱為“散列碰撞(collision)”,這通常是兩個不同長度的輸入值,刻意計算出相同的輸出值。輸入一些數(shù)據(jù)計算出散列值,然后部分改變輸入值,一個具有強混淆特性的散列函數(shù)會產(chǎn)生一個完全不同的散列值哈希函數(shù)需要滿足下述條件
a.確定性:哈希函數(shù)的算法是確定性算法,算法執(zhí)行過程不引入任何隨機量。這意味著相同消息的哈希結(jié)果一定相同
b.高效性:給定任意一個消息m,可以快速計算HASH(m)
c.目標(biāo)抗碰撞性:給定任意一個消息m0 ,很難找到另一個消息m1,使得HASH(m0)= HASH(m1)
d.廣義抗碰撞性:很難找到兩個消息m0不等于m1 ,使得HASH(m0)= HASH(m1) 在密碼學(xué)上,一般認為如果d條件不滿足,那么此哈希函數(shù)就不再安全。
在實際中,一般認為如果在某種程度上c條件不滿足,那么此哈希函數(shù)就不再安全。當(dāng)然了,如果c個條件完全不滿足,那么此哈希函數(shù)已經(jīng)徹底不安全,應(yīng)該被直接棄用。
哈希一般的實際應(yīng)用被稱為安全散列算法,(英語:Secure Hash Algorithm,縮寫為SHA),它是FIPS認證的安全散列算法,是一個密碼散列函數(shù)家族。能計算出一個數(shù)字消息所對應(yīng)到的,長度固定的字符串(又稱消息摘要)的算法。且若輸入的消息不同,它們對應(yīng)到不同字符串的機率很高(以前被認為無限趨近于99.99999999%,為啥是以前,稍后解釋)密碼學(xué)作為一門古老的學(xué)科,有著悠久而奇妙的歷史。它用于保護軍事和外交通信可追溯到幾千年前文字剛剛產(chǎn)生的上古時期。
幾千年來,密碼學(xué)一直在不斷地向前發(fā)展。從凱撒密碼開始,人們在發(fā)展新密碼學(xué)算法的時候也在孜孜不倦的破解已有的密碼學(xué)算法,因為對于破解者來說,密碼難度越高,意味著其背后守護的秘密價值就越大。SHA家族的五個算法,分別是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,后幾個一般也可以統(tǒng)稱為SHA-2,由美國國家安全局(NSA)所設(shè)計,并由美國國家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)發(fā)布;是美國的政府標(biāo)準(zhǔn)。也是眾多互聯(lián)網(wǎng)和電子產(chǎn)品的密鑰門神SHA系列Hash函數(shù)家族是最為知名的Hash函數(shù)家族,MD5,SHA-1和SHA-2都一直被廣泛的使用,比特幣使用的就是屬于SHA-2系列里的SHA-256湊雜算法。
1990年MD4算法被提出,但是被很快發(fā)現(xiàn)了嚴重的安全問題,在1992年被MD5算法取代。MD5算法在之后的十幾年內(nèi)被軟件行業(yè)廣泛使用,直到2004年我國密碼學(xué)家王小云在國際密碼討論年會(CRYPTO)上展示了MD5算法的碰撞并給出了第一個實例。該攻擊復(fù)雜度很低,在普通計算機上只需要幾秒鐘的時間。
在2005年王小云教授與其同事又提出了對SHA-1算法的碰撞算法(Finding Collisions in the Full SHA-1, CRYPTO 2005),不過計算復(fù)雜度為2的69次方,在實際情況下難以實現(xiàn)直到去年(2017年)的2月24日,谷歌拋出了他們驚人的實驗結(jié)果——公布第了一例SHA-1哈希碰撞實例,這項發(fā)表甚至使密碼學(xué)界最為著名的頂會CRYPTO為等其論文修改結(jié)果延期了19個小時。因為簡單來說,Google的工作基本宣判了SHA-1的死刑。在這項工作公布前,大多數(shù)網(wǎng)站https的證書都涉及使用SHA-1算法,包括GitHub在內(nèi)的眾多版本控制工具以及各種云同步服務(wù)都是用SHA-1來區(qū)別文件,很多安全證書或是簽名也使用SHA-1來保證唯一性。
長期以來,人們都認為SHA1是十分安全的,至少大家還沒有找到一次碰撞案例, 不過如今不得不為用戶安全考慮開始升級至SHA-2或者其他算法了。CWI和Google的研究人員們成功找到了一例SHA1碰撞,而且很厲害的是,發(fā)生碰撞的是兩個真實的、可閱讀的PDF文件。這兩個PDF文件內(nèi)容不相同,但SHA1值完全一樣。
為什么這一研究結(jié)果的發(fā)表如此引人注目?這是因為大家都知道散列算法可能存在碰撞, 但只要這種碰撞難以創(chuàng)造,散列算法所支撐的系統(tǒng)就是安全的——而大家之前一直認為SHA1的碰撞案例很難實現(xiàn)。
Google證明這一說法是站不住的,尤其是在現(xiàn)在GPU并行計算得到大范圍應(yīng)用的情況下。Google使用110塊GPU,經(jīng)過一年的計算,總共進行了9百億億次計算(總共9,223,372,036,854,775,808次)創(chuàng)造了這一碰撞案例——這一計算過程的時間開銷固然龐大,但就現(xiàn)在非常普遍的大規(guī)模計算中心來說,并不是難以實現(xiàn)的。這意味著目前實現(xiàn)對于SHA1的碰撞攻擊仍然需要海量的計算時間。
MD5和SHA-1雖然已經(jīng)不建議被使用,但并不能說它們就已經(jīng)完全過時。
事實上,現(xiàn)有的各種更優(yōu)秀的密碼算法都是在舊算法的基礎(chǔ)上建立起來的,而舊的算法體系往往也并不是因為存在固有漏洞而被人們拋棄——計算能力的飛速發(fā)展導(dǎo)致我們的基礎(chǔ)算法必須不斷改進,才能適應(yīng)生產(chǎn)環(huán)境的需要同時避免潛在的安全風(fēng)險。我們也必須保持以最新的眼光來看待和處理工作,當(dāng)新的技術(shù)突破出現(xiàn)時及時關(guān)注,切勿墨守成規(guī),固步自封。
SHA-1和SHA-2是SHA算法不同的兩個版本,它們的構(gòu)造和簽名的長度都有所不一樣,但可以把SHA-2理解為SHA-1的繼承者。比特幣采用的SHA-256屬于SHA-2的256位用法,當(dāng)年(2008年)中本聰構(gòu)寫比特幣時,未曾考慮到SHA算法這么快就能被破解,不過所幸后來的各類數(shù)字貨幣采用了更多更難破解的加密算法,具體大家可以往回翻翻我之前寫的《加密貨幣如何加密》系列。
不過從SHA-1被Google攻破來看,所有承載巨大市值的加密貨幣都應(yīng)該引起警覺,因為共利共識的維護,還是必須建立在加密算法的基石之【量子計算的隱憂】但如果現(xiàn)有加密方式全部失靈,數(shù)字貨幣世界會變成什么樣子?這個聽起來有點天方夜談的想法其實離我們并不遙遠。
當(dāng)十幾年后實用量子計算機出現(xiàn),算力大幅提升,現(xiàn)有的依靠數(shù)學(xué)復(fù)雜度來保證安全性的非對稱密鑰的加密方式很可能會全部失靈。郭光燦院士在演講中就曾提到,基于2000qubit的量子計算機使用shor算法可以在1s完成RSA算法安全性依賴的大數(shù)分解計算。首先簡單講一下什么是量子計算。
量子比特可以制備在兩個邏輯態(tài)0和1的相干疊加態(tài),換句話講,它可以同時存儲0和1。考慮一個 N個物理比特的存儲器,若它是經(jīng)典存儲器,則它只能存儲2^N個可能數(shù)據(jù)當(dāng)中的任一個,若它是量子存儲器,則它可以同時存儲2^N個數(shù),而且隨著 N的增加,其存儲信息的能力將指數(shù)上升,例如,一個250量子比特的存儲器(由250個原子構(gòu)成)可能存儲的數(shù)達2^250,比現(xiàn)有已知的宇宙中全部原子數(shù)目還要多。
由于數(shù)學(xué)操作可以同時對存儲器中全部的數(shù)據(jù)進行,因此,量子計算機在實施一次的運算中可以同時對2^N個輸入數(shù)進行數(shù)學(xué)運算。其效果相當(dāng)于經(jīng)典計算機要重復(fù)實施2^N次操作,或者采用2^N個不同處理器實行并行操作??梢?,量子計算機可以節(jié)省大量的運算資源(如時間、記憶單元等)。
量子計算機并不是一種更快的計算機。它在邏輯、輸出方式等方面與經(jīng)典計算機根本不同,其中最本質(zhì)的就是量子糾纏的存在。在量子信息學(xué)的觀點中,量子糾纏是與物質(zhì)、能量、信息并列的一種自然資源,利用好這種資源能使量子計算機發(fā)揮出巨大威力。但是,如何用它設(shè)計更快的算法,在理論上就是很大的挑戰(zhàn)。
目前,對絕大多數(shù)計算問題,理論家們都還沒有找到超過經(jīng)典算法的量子算法;但在一些特殊問題上確實有了新的發(fā)現(xiàn)。哪些問題呢?最早發(fā)現(xiàn)的主要有兩類:一類可以歸結(jié)為質(zhì)因數(shù)分解(Shor 算法),比已知最快經(jīng)典算法有指數(shù)加速(準(zhǔn)確說是超多項式加速);另一類可以歸結(jié)為無序搜索(Grove 算法),比經(jīng)典算法有多項式加速。
Shor 算法和 Grove 算法分別于1994年和1996年被提出,可以說是它們的發(fā)現(xiàn)引起了科學(xué)界對量子計算的真正重視——盡管量子計算的初步概念在80年代初就已出現(xiàn),但十幾年來都只是很小圈子內(nèi)的理論游戲,被認為既無法實現(xiàn)也沒有用處;Shor 算法和 Grove 算法終于為量子計算機找到了可能的實際應(yīng)用。
其中 Shor 算法的影響尤其大——現(xiàn)代密碼學(xué)中,幾類常用的公鑰系統(tǒng)包括 RSA (Rivest–Shamir–Adleman) 和 ECC (ellipTIc-curve cryptography) 等的基本加密原理就是大數(shù)分解的計算復(fù)雜度。因此量子計算機一旦出現(xiàn),將給現(xiàn)有的信息安全帶來巨大威脅,加密貨幣現(xiàn)有的算法也幾乎全部不堪一擊。
順帶一提,ECC就是比特幣使用的加密方式?;F盧大學(xué)量子計算學(xué)院的聯(lián)合創(chuàng)始人Michele Mosca(也是圓周理論物理研究所的研究人員)認為我們現(xiàn)在所用的部分加密工具,到2026年就有1/7的概率遭破解;到了2031年,這個數(shù)字又會上升到50%。也就是說,到那個時候,如果我們還在用現(xiàn)在的加密機制,那么即便網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)經(jīng)過了加密,也可通過暴力破解來解密——這也是量子計算能夠帶來的“便利”。有人想到既然量子計算可以帶來算力提升破解加密算法,那么可不可以用量子算法來直接加密呢?答案是可行但目前一切未知。
量子加密設(shè)備中必不可少的、同時也是最昂貴的部件是光子探測器,在現(xiàn)有(或者不遠的將來)條件下,發(fā)起一次量子計算攻擊可以帶來巨大收益而有人愿意為此買單,但如果說使用量子加密算法的數(shù)字貨幣都采用這個類型的礦機,那又是不可能承受的成本之痛了,不過未來一二十年會發(fā)什么樣神奇的事情,誰又能預(yù)
【EKT的思考】
在20世紀(jì)70年代,英國情報部門和學(xué)術(shù)機構(gòu)的研究人員各自獨立發(fā)明了非對稱加密方法。
它使用兩個不同的密鑰:一個公鑰和一個私鑰。
在一次交易的加密過程中,兩個密鑰都是必需的。例如,在進行線上購物時,供應(yīng)商的服務(wù)器把公鑰發(fā)送到消費者的電腦,這個密鑰是公開的,可以被所有消費者獲取并使用。消費者的電腦用該公鑰加密一個密鑰,后者將作為與供應(yīng)商共享的對稱密鑰。在收到經(jīng)過加密的對稱密鑰之后,供應(yīng)商的服務(wù)器將用一個自己獨有的私鑰對之進行解密。一旦雙方安全地共享了對稱密鑰,就可以用其完成后續(xù)交易的加解密。
非對稱加密算法需要兩個密鑰: 公開密鑰(publickey)和私有密鑰(privatekey)。
公開密鑰與私有密鑰是一對,如果用公開密鑰對數(shù)據(jù)進行加密,只有用對應(yīng)的私有密鑰才能解密;如果用私有密鑰對數(shù)據(jù)進行加密,那么只有用對應(yīng)的公開密鑰才能解密。因為加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法。
非對稱加密算法實現(xiàn)機密信息交換的基本過程是: 甲方生成一對密鑰并將其中的一把作為公用密鑰向其它方公開;得到該公用密鑰的乙方使用該密鑰對機密信息進行加密后再發(fā)送給甲方;甲方再用自己保存的另一把專用密鑰對加密后的信息進行解密另一方面,甲方可以使用乙方的公鑰對機密信息進行簽名后再發(fā)送給乙方;乙方再用自己的私匙對數(shù)據(jù)進行驗簽。
甲方只能用其專用密鑰解密由其公用密鑰加密后的任何信息。 非對稱加密算法的保密性比較好,它消除了最終用戶交換密鑰的需要在EKT中,我們就使用了公私鑰結(jié)合的非對稱加密和路由策略的機制實現(xiàn)拜占庭容錯。我們EKT的多鏈,采用“多鏈分而治之”的新方案重新設(shè)計了一個保障每個合約都能正常運行的公鏈,其中就使用到了非對稱加密對用戶的信息進行保存,同時主鏈和子鏈信息共享但是功能隔離。
這一創(chuàng)新極大程度上簡化了架構(gòu),降低了數(shù)據(jù)處理壓力,確保一條鏈上流量激增不會影響到另一條鏈的效率,在鏈上進行的任何業(yè)務(wù)都不會收到其他業(yè)務(wù)干擾,有效實現(xiàn)了資源隔離在EKT中Token鏈?zhǔn)且粋€并行多鏈的結(jié)構(gòu),多鏈多共識,共享用戶基礎(chǔ)。
EKT的Token是鏈上的一個屬性,就像使用了utxo模型的鏈utxo有其他Token一樣,我們的轉(zhuǎn)賬事件也是內(nèi)置的其實EKT解決的一個核心問題是,目前Dapp的開發(fā)難度的問題如果使用以太坊的Solidity開發(fā),需要學(xué)習(xí)以太坊的一整套邏輯,在復(fù)雜應(yīng)用開發(fā)的時候需要考慮各種優(yōu)化方案,同一個功能使用傳統(tǒng)C/S結(jié)構(gòu)一天寫完的,用以太坊可能要寫幾周時間,對開發(fā)者來說很不友好。
這一套流程若要Dapp/公鏈開發(fā)者寫出來,勢必在真正開發(fā)區(qū)塊鏈功能之前就已經(jīng)被這些繁瑣但其實通用的步驟耗費過多精力和資源在EKT中,堅持了這樣一個理念,一個貨幣系統(tǒng)中不需要圖靈完備的開發(fā)語言,不同的應(yīng)用間盡可能實現(xiàn)隔離的原則。因此我們在設(shè)計的時候,把token的處理和DApp的處理分開了,也就是說在EKT上存在兩種類型的鏈:token鏈和DApp鏈token鏈就是專門用于處理token交易的一條鏈,鑒于ERC20代幣不斷曝出的各種漏洞(雖然漏洞的產(chǎn)生是智能合約開發(fā)者的問題,但是我們認為是有更好的方案來實現(xiàn)的),在EKT上內(nèi)置了token對象,開發(fā)者只需要定義自己要發(fā)的token的數(shù)量即可。
另外,EKT的token鏈?zhǔn)且粋€多鏈多共識的結(jié)構(gòu),也就是說不同的token可以放在不同的token鏈上進行打包,多鏈并行極大提高交易處理速度EKT的DApp鏈?zhǔn)枪┎煌_發(fā)者開發(fā)DApp的一條鏈。我們從智能合約開發(fā)語言、數(shù)據(jù)存儲(帶有默克爾證明的和私有的不帶默克爾證明的存儲空間)、效率三個方面進行了優(yōu)化。
EKT的DApp鏈基本上可以實現(xiàn)與現(xiàn)在的互聯(lián)網(wǎng)應(yīng)用相同甚至更快的開發(fā)速度,可實現(xiàn)的功能性也與互聯(lián)網(wǎng)應(yīng)用沒有太大差異,最重要的是,我們可以實現(xiàn)大部分事件的1秒執(zhí)行和確認,安全性要求比較高的事件可以實現(xiàn)3秒的確認EKT的中心思想就是設(shè)計一個社區(qū)的機制,讓開發(fā)者可以輕易的開發(fā)一個可以承載DAPP的主鏈,其他的交給EKT來處理, EKT 的“一鏈一主幣,多鏈多共識”的機制為后來的區(qū)塊鏈項目開發(fā)提供了很大的便利,可以使用于任何區(qū)塊鏈適用的應(yīng)用場景。
EKT 提供了一套底層的區(qū)塊鏈機制,其他的區(qū)塊鏈項目可以很容易的基于 EKT 的主鏈代碼部署一套自己的主鏈。在EKT上編寫的區(qū)塊鏈項目將無需過于擔(dān)心安全性問題,因為每一個接口都是非常簡單并且在許多條并行主鏈上部署和運行的。
部署主鏈時可以靈活的發(fā)行自己主鏈的代幣以及選擇共識算法。新部署的主鏈也可以加入到 EKT 的整個生態(tài),共享 EKT 生態(tài)的用戶資源,代幣也可以和EKT 主幣以及其他主鏈的代幣進行交換。
在設(shè)計EKT的加密制度時,我們團隊也曾經(jīng)認真考慮過SHA-1破解以及未來量子計算技術(shù)大發(fā)展之后對區(qū)塊鏈?zhǔn)澜绲挠绊?,甚至一度想要立馬著手實現(xiàn)這個看似fancy的功能。不過經(jīng)過深思熟慮之后,我們團隊還是決定將現(xiàn)在有限的資源盡可能投入到平臺的開發(fā)工作當(dāng)中,同時我以及幾個同事都會密切關(guān)注加密貨幣安全方面的進展,保持可以參考和跟緊最新最安全的學(xué)術(shù)界新動向。以上就是我對區(qū)塊鏈密碼學(xué)的一些思考,和一些在設(shè)計EKT的多鏈多共識時對建設(shè)非對稱加密底層的考慮。