EKT多鏈技術丨區塊鏈的密碼學之二

 

     前言:談區塊鏈離不開密碼學。從凱撒密碼到維吉尼亞密碼,從單表位移到多表代換,從對稱加密,到非對稱加密,密碼學已經走過了漫長的三千年。作爲一門古老的學科,如今卻又因爲互聯網和區塊鏈技術重新閃耀光彩。傳統互聯網離不開密碼學來保護一切可能被攻擊的信息傳輸,區塊鏈則利用塊鏈式數據結構來驗證與存儲數據、利用分佈式節點公式算法來生成和更新數據、利用密碼學的方式保證數據傳輸和訪問的安全、利用由自動化腳本代碼組成的智能合約來編程和操作數據的一種全新的分佈式基礎架構與計算範式。區塊鏈的核心是它按照時間順序將數據區塊以順序相連的方式組合成的一種鏈式數據結構,並以密碼學方式保證的不可篡改和不可僞造的分佈式賬本。我們對此做一個總結,可以發現區塊鏈中有四項不可缺的核心技術,分別是分佈式存儲、共識機制、密碼學原理和智能合約。今天我們將延續上週的話題,繼續從密碼學的角度聊一聊區塊鏈的起源問題。

 

【失靈的SHA-1】

​      區塊鏈玩家應該都對一個詞非常的熟悉——哈希。

 

      Hash,一般學術界翻譯做“散列”,程序員直接音譯爲“哈希”,它的操作是把任意長度的輸入(又叫做預映射pre-image)通過散列算法變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來確定唯一的輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。

 

      所有散列函數都有一個基本特性:如果兩個散列值是不相同的(根據同一函數),那麼這兩個散列值的原始輸入也是不相同的。這個特性是散列函數具有確定性的結果,具有這種性質的散列函數稱爲單向散列函數。但另一方面,散列函數的輸入和輸出不是唯一對應關係的,如果兩個散列值相同,兩個輸入值很可能是相同的,但也可能不同,這種情況稱爲“散列碰撞(collision)”,這通常是兩個不同長度的輸入值,刻意計算出相同的輸出值。輸入一些數據計算出散列值,然後部分改變輸入值,一個具有強混淆特性的散列函數會產生一個完全不同的散列值。

 

      哈希函數需要滿足下述條件:

 

      a.確定性:哈希函數的算法是確定性算法,算法執行過程不引入任何隨機量。這意味着相同消息的哈希結果一定相同。

      b.高效性:給定任意一個消息m,可以快速計算HASH(m) 。

      c.目標抗碰撞性:給定任意一個消息m0 ,很難找到另一個消息m1,使得HASH(m0)= HASH(m1) 

      d.廣義抗碰撞性:很難找到兩個消息m0不等於m1 ,使得HASH(m0)= HASH(m1)。

 

      在密碼學上,一般認爲如果d條件不滿足,那麼此哈希函數就不再安全。在實際中,一般認爲如果在某種程度上c條件不滿足,那麼此哈希函數就不再安全。當然了,如果c個條件完全不滿足,那麼此哈希函數已經徹底不安全,應該被直接棄用。

 

      哈希一般的實際應用被稱爲安全散列算法,(英語:Secure Hash Algorithm,縮寫爲SHA),它是FIPS認證的安全散列算法,是一個密碼散列函數家族。能計算出一個數字消息所對應到的,長度固定的字符串(又稱消息摘要)的算法。且若輸入的消息不同,它們對應到不同字符串的機率很高(以前被認爲無限趨近於99.99999999%,爲啥是以前,稍後解釋)。

 

      密碼學作爲一門古老的學科,有着悠久而奇妙的歷史。它用於保護軍事和外交通信可追溯到幾千年前文字剛剛產生的上古時期。幾千年來,密碼學一直在不斷地向前發展。從凱撒密碼開始,人們在發展新密碼學算法的時候也在孜孜不倦的破解已有的密碼學算法,因爲對於破解者來說,密碼難度越高,意味着其背後守護的祕密價值就越大。SHA家族的五個算法,分別是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,後幾個一般也可以統稱爲SHA-2,由美國國家安全局(NSA)所設計,並由美國國家標準與技術研究院(NIST)發佈;是美國的政府標準。也是衆多互聯網和電子產品的密鑰門神。

 

      SHA系列Hash函數家族是最爲知名的Hash函數家族,MD5,SHA-1和SHA-2都一直被廣泛的使用,比特幣使用的就是屬於SHA-2系列裏的SHA-256湊雜算法。1990年MD4算法被提出,但是被很快發現了嚴重的安全問題,在1992年被MD5算法取代。MD5算法在之後的十幾年內被軟件行業廣泛使用,直到2004年我國密碼學家王小云在國際密碼討論年會(CRYPTO)上展示了MD5算法的碰撞並給出了第一個實例。該攻擊複雜度很低,在普通計算機上只需要幾秒鐘的時間。在2005年王小云教授與其同事又提出了對SHA-1算法的碰撞算法(Finding Collisions in the Full SHA-1, CRYPTO 2005),不過計算複雜度爲2的69次方,在實際情況下難以實現。

 

      直到去年(2017年)的2月24日,谷歌拋出了他們驚人的實驗結果——公佈第了一例SHA-1哈希碰撞實例,這項發表甚至使密碼學界最爲著名的頂會CRYPTO爲等其論文修改結果延期了19個小時。因爲簡單來說,Google的工作基本宣判了SHA-1的死刑。在這項工作公佈前,大多數網站https的證書都涉及使用SHA-1算法,包括GitHub在內的衆多版本控制工具以及各種雲同步服務都是用SHA-1來區別文件,很多安全證書或是簽名也使用SHA-1來保證唯一性。長期以來,人們都認爲SHA1是十分安全的,至少大家還沒有找到一次碰撞案例, 不過如今不得不爲用戶安全考慮開始升級至SHA-2或者其他算法了。

 

      CWI和Google的研究人員們成功找到了一例SHA1碰撞,而且很厲害的是,發生碰撞的是兩個真實的、可閱讀的PDF文件。這兩個PDF文件內容不相同,但SHA1值完全一樣。

 

 

      爲什麼這一研究結果的發表如此引人注目?這是因爲大家都知道散列算法可能存在碰撞, 但只要這種碰撞難以創造,散列算法所支撐的系統就是安全的——而大家之前一直認爲SHA1的碰撞案例很難實現。Google證明這一說法是站不住的,尤其是在現在GPU並行計算得到大範圍應用的情況下。Google使用110塊GPU,經過一年的計算,總共進行了9百億億次計算(總共9,223,372,036,854,775,808次)創造了這一碰撞案例——這一計算過程的時間開銷固然龐大,但就現在非常普遍的大規模計算中心來說,並不是難以實現的。這意味着目前實現對於SHA1的碰撞攻擊仍然需要海量的計算時間

 

 

      MD5和SHA-1雖然已經不建議被使用,但並不能說它們就已經完全過時。事實上,現有的各種更優秀的密碼算法都是在舊算法的基礎上建立起來的,而舊的算法體系往往也並不是因爲存在固有漏洞而被人們拋棄——計算能力的飛速發展導致我們的基礎算法必須不斷改進,才能適應生產環境的需要同時避免潛在的安全風險。我們也必須保持以最新的眼光來看待和處理工作,當新的技術突破出現時及時關注,切勿墨守成規,固步自封。SHA-1和SHA-2是SHA算法不同的兩個版本,它們的構造和簽名的長度都有所不一樣,但可以把SHA-2理解爲SHA-1的繼承者。比特幣採用的SHA-256屬於SHA-2的256位用法,當年(2008年)中本聰構寫比特幣時,未曾考慮到SHA算法這麼快就能被破解,不過所幸後來的各類數字貨幣採用了更多更難破解的加密算法,具體大家可以往回翻翻我之前寫的《加密貨幣如何加密》系列。不過從SHA-1被Google攻破來看,所有承載巨大市值的加密貨幣都應該引起警覺,因爲共利共識的維護,還是必須建立在加密算法的基石之上。

 

【量子計算的隱憂】

      但如果現有加密方式全部失靈,數字貨幣世界會變成什麼樣子?

 

      這個聽起來有點天方夜談的想法其實離我們並不遙遠。當十幾年後實用量子計算機出現,算力大幅提升,現有的依靠數學複雜度來保證安全性的非對稱密鑰的加密方式很可能會全部失靈。郭光燦院士在演講中就曾提到,基於2000qubit的量子計算機使用shor算法可以在1s完成RSA算法安全性依賴的大數分解計算。

 

      首先簡單講一下什麼是量子計算。量子比特可以製備在兩個邏輯態0和1的相干疊加態,換句話講,它可以同時存儲0和1。考慮一個 N個物理比特的存儲器,若它是經典存儲器,則它只能存儲2^N個可能數據當中的任一個,若它是量子存儲器,則它可以同時存儲2^N個數,而且隨着 N的增加,其存儲信息的能力將指數上升,例如,一個250量子比特的存儲器(由250個原子構成)可能存儲的數達2^250,比現有已知的宇宙中全部原子數目還要多。 由於數學操作可以同時對存儲器中全部的數據進行,因此,量子計算機在實施一次的運算中可以同時對2^N個輸入數進行數學運算。其效果相當於經典計算機要重複實施2^N次操作,或者採用2^N個不同處理器實行並行操作。可見,量子計算機可以節省大量的運算資源(如時間、記憶單元等)。

 

      量子計算機並不是一種更快的計算機。它在邏輯、輸出方式等方面與經典計算機根本不同,其中最本質的就是量子糾纏的存在。在量子信息學的觀點中,量子糾纏是與物質、能量、信息並列的一種自然資源,利用好這種資源能使量子計算機發揮出巨大威力。但是,如何用它設計更快的算法,在理論上就是很大的挑戰。目前,對絕大多數計算問題,理論家們都還沒有找到超過經典算法的量子算法;但在一些特殊問題上確實有了新的發現。哪些問題呢?最早發現的主要有兩類:一類可以歸結爲質因數分解(Shor 算法),比已知最快經典算法有指數加速(準確說是超多項式加速);另一類可以歸結爲無序搜索(Grove 算法),比經典算法有多項式加速。

 

      Shor 算法和 Grove 算法分別於1994年和1996年被提出,可以說是它們的發現引起了科學界對量子計算的真正重視——儘管量子計算的初步概念在80年代初就已出現,但十幾年來都只是很小圈子內的理論遊戲,被認爲既無法實現也沒有用處;Shor 算法和 Grove 算法終於爲量子計算機找到了可能的實際應用。其中 Shor 算法的影響尤其大——現代密碼學中,幾類常用的公鑰系統包括 RSA (Rivest–Shamir–Adleman) 和 ECC (elliptic-curve cryptography) 等的基本加密原理就是大數分解的計算複雜度。因此量子計算機一旦出現,將給現有的信息安全帶來巨大威脅,加密貨幣現有的算法也幾乎全部不堪一擊。順帶一提,ECC就是比特幣使用的加密方式。

滑鐵盧大學量子計算學院的聯合創始人Michele Mosca(也是圓周理論物理研究所的研究人員)認爲我們現在所用的部分加密工具,到2026年就有1/7的概率遭破解;到了2031年,這個數字又會上升到50%。也就是說,到那個時候,如果我們還在用現在的加密機制,那麼即便網絡傳輸的數據經過了加密,也可通過暴力破解來解密——這也是量子計算能夠帶來的“便利”。

 

      有人想到既然量子計算可以帶來算力提升破解加密算法,那麼可不可以用量子算法來直接加密呢?答案是可行但目前一切未知。量子加密設備中必不可少的、同時也是最昂貴的部件是光子探測器,在現有(或者不遠的將來)條件下,發起一次量子計算攻擊可以帶來巨大收益而有人願意爲此買單,但如果說使用量子加密算法的數字貨幣都採用這個類型的礦機,那又是不可能承受的成本之痛了,不過未來一二十年會發什麼樣神奇的事情,誰又能預測呢?

 

     【EKT的思考】

      在20世紀70年代,英國情報部門和學術機構的研究人員各自獨立發明了非對稱加密方法。它使用兩個不同的密鑰:一個公鑰和一個私鑰。在一次交易的加密過程中,兩個密鑰都是必需的。例如,在進行線上購物時,供應商的服務器把公鑰發送到消費者的電腦,這個密鑰是公開的,可以被所有消費者獲取並使用。消費者的電腦用該公鑰加密一個密鑰,後者將作爲與供應商共享的對稱密鑰。在收到經過加密的對稱密鑰之後,供應商的服務器將用一個自己獨有的私鑰對之進行解密。一旦雙方安全地共享了對稱密鑰,就可以用其完成後續交易的加解密。

 

      非對稱加密算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密。因爲加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法。 非對稱加密算法實現機密信息交換的基本過程是:甲方生成一對密鑰並將其中的一把作爲公用密鑰向其它方公開;得到該公用密鑰的乙方使用該密鑰對機密信息進行加密後再發送給甲方;甲方再用自己保存的另一把專用密鑰對加密後的信息進行解密。

 

      另一方面,甲方可以使用乙方的公鑰對機密信息進行簽名後再發送給乙方;乙方再用自己的私匙對數據進行驗籤。甲方只能用其專用密鑰解密由其公用密鑰加密後的任何信息。 非對稱加密算法的保密性比較好,它消除了最終用戶交換密鑰的需要。

 

      在EKT中,我們就使用了公私鑰結合的非對稱加密和路由策略的機制實現拜占庭容錯。我們EKT的多鏈,採用“多鏈分而治之”的新方案重新設計了一個保障每個合約都能正常運行的公鏈,其中就使用到了非對稱加密對用戶的信息進行保存,同時主鏈和子鏈信息共享但是功能隔離。這一創新極大程度上簡化了架構,降低了數據處理壓力,確保一條鏈上流量激增不會影響到另一條鏈的效率,在鏈上進行的任何業務都不會收到其他業務干擾,有效實現了資源隔離。

 

      在EKT中Token鏈是一個並行多鏈的結構,多鏈多共識,共享用戶基礎。EKT的Token是鏈上的一個屬性,就像使用了utxo模型的鏈utxo有其他Token一樣,我們的轉賬事件也是內置的。

 

      其實EKT解決的一個核心問題是,目前Dapp的開發難度的問題如果使用以太坊的Solidity開發,需要學習以太坊的一整套邏輯,在複雜應用開發的時候需要考慮各種優化方案,同一個功能使用傳統C/S結構一天寫完的,用以太坊可能要寫幾周時間,對開發者來說很不友好。這一套流程若要Dapp/公鏈開發者寫出來,勢必在真正開發區塊鏈功能之前就已經被這些繁瑣但其實通用的步驟耗費過多精力和資源。

 

       在EKT中,堅持了這樣一個理念,一個貨幣系統中不需要圖靈完備的開發語言,不同的應用間儘可能實現隔離的原則。因此我們在設計的時候,把token的處理和DApp的處理分開了,也就是說在EKT上存在兩種類型的鏈:token鏈和DApp鏈。

 

       token鏈就是專門用於處理token交易的一條鏈,鑑於ERC20代幣不斷曝出的各種漏洞(雖然漏洞的產生是智能合約開發者的問題,但是我們認爲是有更好的方案來實現的),在EKT上內置了token對象,開發者只需要定義自己要發的token的數量即可。另外,EKT的token鏈是一個多鏈多共識的結構,也就是說不同的token可以放在不同的token鏈上進行打包,多鏈並行極大提高交易處理速度。

 

       EKT的DApp鏈是供不同開發者開發DApp的一條鏈。我們從智能合約開發語言、數據存儲(帶有默克爾證明的和私有的不帶默克爾證明的存儲空間)、效率三個方面進行了優化。EKT的DApp鏈基本上可以實現與現在的互聯網應用相同甚至更快的開發速度,可實現的功能性也與互聯網應用沒有太大差異,最重要的是,我們可以實現大部分事件的1秒執行和確認,安全性要求比較高的事件可以實現3秒的確認。

 

       EKT的中心思想就是設計一個社區的機制,讓開發者可以輕易的開發一個可以承載DAPP的主鏈,其他的交給EKT來處理, EKT 的“一鏈一主幣,多鏈多共識”的機制爲後來的區塊鏈項目開發提供了很大的便利,可以使用於任何區塊鏈適用的應用場景。 EKT 提供了一套底層的區塊鏈機制,其他的區塊鏈項目可以很容易的基於 EKT 的主鏈代碼部署一套自己的主鏈。在EKT上編寫的區塊鏈項目將無需過於擔心安全性問題,因爲每一個接口都是非常簡單並且在許多條並行主鏈上部署和運行的。部署主鏈時可以靈活的發行自己主鏈的代幣以及選擇共識算法。新部署的主鏈也可以加入到 EKT 的整個生態,共享 EKT 生態的用戶資源,代幣也可以和EKT 主幣以及其他主鏈的代幣進行交換和流通。

 

      在設計EKT的加密制度時,我們團隊也曾經認真考慮過SHA-1破解以及未來量子計算技術大發展之後對區塊鏈世界的影響,甚至一度想要立馬着手實現這個看似fancy的功能。不過經過深思熟慮之後,我們團隊還是決定將現在有限的資源儘可能投入到平臺的開發工作當中,同時我以及幾個同事都會密切關注加密貨幣安全方面的進展,保持可以參考和跟緊最新最安全的學術界新動向。

 

      以上就是我對區塊鏈密碼學的一些思考,和一些在設計EKT的多鏈多共識時對建設非對稱加密底層的考慮。歡迎大家提出疑問,共同探討。

 

      End

 

參考閱讀:

20160519 計算文件SHA-1值原理

20161225 加密算法之:對稱加密與非對稱加密掃盲貼

20170119 區塊鏈 - 比特幣的共識機制

20170223密碼學大事件!研究人員公佈第一例SHA-1哈希碰撞實例

20170313 比特幣中的SHA256是何方神聖?

20170418 Hash算法總結

20170919 散列算法:SHA-1,SHA-2和SHA-256之間的區別

20180414詳解“多鏈多共識”機制

20180202 區塊鏈和比特幣 不過是密碼學歷史上的一次小高潮?

《History of cryptography》

《BTC whitepaper》

《EKT whitepaper》

 


END

 

今天關於“區塊鏈&密碼學二”的文章就這裏

如果有任何技術上的問題想與我討論

歡迎關注微信公衆號:EKT多鏈技術

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