BTC
ETH
HTX
SOL
BNB
查看行情
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt

區塊鏈中的密碼學

EKT多链技术
特邀专栏作者
本文約13697字,閱讀全文需要約20分鐘
EKT多鏈技術談| 區塊鏈中的密碼學
AI總結
展開
EKT多鏈技術談| 區塊鏈中的密碼學

前言:談區塊鏈離不開密碼學。通常來講,區塊鏈技術是利用塊鍊式數據結構來驗證與存儲數據、利用分佈式節點公式算法來生成和更新數據、利用密碼學的方式保證數據傳輸和訪問的安全、利用由自動化腳本代碼組成的智能合約來編程和操作數據的一種全新的分佈式基礎架構與計算範式。區塊鏈的核心是它按照時間順序將數據區塊以順序相連的方式組合成的一種鍊式數據結構,並以密碼學方式保證的不可篡改和不可偽造的分佈式賬本。我們對此做一個總結,可以發現區塊鏈中有四項不可缺的核心技術,分別是分佈式存儲、共識機制、密碼學原理和智能合約。而今天我們將主要從密碼學的角度聊一聊區塊鏈的起源問題。

【愷撒密碼】

密碼學作為一門古老的學科,有著悠久而奇妙的歷史。它用於保護軍事和外交通信可追溯到幾千年前文字剛剛產生的上古時期。幾千年來,密碼學一直在不斷地向前發展。而隨著當今信息時代的高速發展,密碼學的作用也越來越顯得重要。它已不僅僅局限於使用在軍事、政治和外交方面,而更多的是與人們的生活息息相關:如人們在進行網上購物,與商務交流,使用信用卡等等,都需要密碼學的知識來保護人們的個人信息和隱私,當然對於我們關注的區塊鏈技術,密碼學作為其基石而存在。

凱撒(Caesar)是第一個把替換密碼用於軍事用途、並且記錄下來的人。在他的那本歌頌自己豐功偉績的《高盧記》裡,凱撒描述了他把密信送到正處於圍困之中、瀕臨投降的西塞羅手中。凱撒非常喜歡使用密文,後世的《凱撒傳》詳細地記錄了凱撒使用的一種密文。而這種加密方法,甚至沿用到今天。

凱撒密碼的表示方法是:將每個字母,用字母表中這個字母之後三位的那個字母替代。它是一種替換加密的技術,明文中的所有字母都在字母表上向後(或向前)按照一個固定數目進行偏移後被替換成密文。例,當偏移量是3的時候,所有的字母A將被替換成D,B變成E,以此類推。也就是字母A用字母D替代,字母B用字母E替代。比如Abroad,凱撒在用密文寫信的時候,就被替換為Deurdg。這樣就得到了敵人看不懂的密文。

假如有這樣一條指令:

RETURN TO ROME

用愷撒密碼加密後就成為:

UHWXUQ WR URPH

如果這份指令被敵方截獲,也將不會洩密,因為字面上看不出任何意義。

現在看來這種加密方式可能稍顯幼稚,但作為歷史上文字記載的最早使用加密密鑰的案例:由發件人和收件人共享加密密鑰,標誌了現代密碼學的發端。可以說,從凱撒密碼,到20世紀公共密鑰被發明之前的這幾千年時間裡,密碼學的原理都是一樣的。比特幣和區塊鏈的加密方式,跟凱撒密碼的原理區別,也就是多了公鑰而已。直到今天,我們在看很多諜戰片的時候,會發現不少特工和間諜還是採取這種方式傳輸情報。

這裡有幾個術語,需要特別指出。密碼學家通常講用來書寫原始信息的字母表,也就是正常的字母表,稱為明碼表;而用來替換明碼字母的稱為密碼表。這也是密碼這個詞的來歷。那麼往後移動三位,這個“三”則被稱為密鑰。當然,學過數學的人都明白,這裡有26個字母,僅僅按照順序移動,每個字母就有25個不同的替代方式,即25種密鑰,要是把字母順序打亂,密鑰就更多了。算法則是通過各種嘗試,破譯密碼的過程。

可以想像,在公元前100年左右,也就是相當於中國的西漢時期,要想破譯凱撒的密碼,那可能性幾乎為零。在密碼學中,愷撒密碼是一種最簡單且最廣為人知的加密技術。愷撒密碼還在現代的ROT13系統中被應用。但是和所有的利用字母表進行替換的加密技術一樣,愷撒密碼非常容易被破解,而且在實際應用中也無法保證通信安全。

【多表代換】

最早的古典密碼體制主要包含單表代換密碼體制和多表代換密碼體制。作為古典密碼中的兩種重要體制,一直在古代歷史上的全球各個區域廣泛地被使用。凱撒密碼就是一種典型的單表代換密碼。

單表代換密碼在長達一千年的時間裡,被認為是無法破解的,因為存在著數量龐大的密鑰,依靠手工是根本計算不過來的。但是隨著社會的發展和技術的進步,來自東方的阿拉伯人,找到了更新的技術,從而發現了一條捷徑來破獲這個被認為是無解的密碼,這次勝利是由阿拉伯世界的語言學家、統計學家和宗教學家三者共同完成的。

這還要間接感謝中國的造紙術的發明,伊斯蘭文明得以快速傳播。因為書籍需求量大增,那麼就需要有人來校對,最能勝任這個工作的自然是神學家。他們在校對的同時,還在統計默罕默德啟示錄的用詞頻率,如果這個啟示錄出現了新詞,那麼它出現的年份肯定就更往後等等。在梳理的過程中,他們也順道發現了一些字母出現的頻率就是比其他的字母要高得多。

學習過英語的我們知道,字母e是最常見的,其次是字母t和a。如果按照凱撒密碼加密,一個密碼字母對應明碼字母,那麼密碼字母中出現次數最多的很有可能就應該對應明碼字母E,以此類推,很容易就可以排除掉大量的密鑰,從而快速地找到正確的破譯方法。現在無法考證究竟是誰把字母出現的頻率和破譯密碼聯繫在了一起,但是可以肯定的是,公元九世紀的時候,阿拉伯人就已經非常擅長破譯凱撒密碼了。

阿拉伯人從公元7世紀到公元12世紀期間,建立了輝煌燦爛的文明,相比較而言,歐洲當時還是愚昧落後貧窮的地方。伊斯蘭文明的繁盛,不僅帶來了藝術、科學等文化的繁榮,社會的統治和管理也是非常有條理和高效的。當時的管理者,不僅在政府的關鍵事務上進行加密,而且記錄稅收的時候也採用了密碼術,他們在《大臣手冊》等管理文獻裡還在探討與密碼術有關的技術性問題。正是因為有了巨大的需求,再加上科學技術的進步,阿拉伯人終於有機會破譯替換密碼這道千年難題。

單表代換的破譯十分簡單,因為在單表代換下,除了字母名稱改變以外,字母的頻度、重複字母模式、字母結合方式等統計特性均未發生改變,依靠這些不變的統計特性就能破譯單表代換。相對單表代換來說,多表代換密碼的破譯要難得多。

多表代換大約是在1467年左右由佛羅倫薩的建築師Alberti發明的。多表代換密碼又分為非週期多表代換密碼和周期多表代換密碼。在一個多表替換密碼中,會使用多個字母作為密碼。為了加快加密或解密速度,所有的字母通常寫在一張表格上,密碼學上稱作tableau。這種表格通常是26×26,因為這樣才能放下全部26個英文字母。填充表格及選擇下次使用的字母的方法,就是不同多字母替換密碼之間的定義。多字母替換密碼比單字母更難打破,因為其替換可能性多,密文要較長才可。

其中最著名的一種為貝拉索於1585年推出的維吉尼亞密碼。它於1863年之前一直未被破解。法國人稱它作“不能破譯的密碼”(法語:le chiffre indéchiffrable)。此密碼曾被誤以為由布萊斯·德·維吉尼亞所創,所以才叫作維吉尼亞密碼。

維吉尼亞密碼中,表格的第一行只需直接填上26個字母,然後以下每一行的字母都是向左偏移一格。 (這叫作表格橫移,數學上每一列同餘26。)要用這種密碼需要使用一個關鍵字來作為密鑰。關鍵字每次用完就再次重複。假設關鍵字是“CAT”,明文的第一個字由“C”加密,第二個字由“A”加密,第三個則由“T”加密,然後再回到C加密,一直重複。然後按照右邊的密碼表加密,例如BALL用CAT作關鍵字時會加密至DAEN,可見即使是同一個“L”亦會加密至另一個字母。現實中,維吉尼亞密碼的關鍵字非常長。

非週期多表代換密碼,對每個明文字母都採用不同的代換錶(或密鑰),稱作一次一密密碼,只要加密表夠長,這是一種在理論上唯一不可破的密碼。這種密碼可以完全隱蔽明文的特點,但由於需要的密鑰量和明文消息長度相同而難於廣泛使用。

為了減少密鑰量,在實際應用當中多采用周期多表代換密碼。在16世紀,有各種各樣的多表自動密鑰密碼被使用,最矚目的當屬法國人http://B.deVigtnère的Vigenère密碼體制。有名的多表代換密碼有Vigenère、Beaufort、Running-Key、Vernam和轉輪機(rotor machine)。對於單表代換和多表代換密碼來說,唯密文分析是可行的。單表代換和多表代換密碼都是以單個字母作為代換對象的,而每次對多個字母進行代換就是多字母代換密碼。大約1854年L.Playfair在英國推廣Playfair密碼,它是由英國科學家C.Wheatstone發明的。這是第一種多字母代換密碼,在第一次世界大戰中英國人就採用這種密碼。多字母代換的優點是容易將字母的自然頻度隱蔽或均勻化而有利於抵抗統計分析。這種密碼主要有Playfair密碼、Hill密碼等。

到二十世紀二十年代,人們發明了各種機械加密設備用來自動處理加密。大多數是基於轉輪的概念。 1918年美國人EHHebern造出了第一台轉輪機,它是基於一台用有線連接改造的早期打字機來產生單字母表替代的,輸出是通過原始的亮燈式指示。最著名的轉輪裝置是Enigma,它是由德國人Scherbius發明並製造的。它在第二次世界大戰中由德國人使用。不過在第二次世界大戰期間,它就被破譯了。

【近代密碼學】

近代密碼學研究信息從發端到收端的安全傳輸和安全存儲,是研究“知己知彼”的一門科學。其核心是密碼編碼學和密碼分析學。前者致力於建立難以被敵方或對手攻破的安全密碼體制,即“知己”;後者則力圖破譯敵方或對手已有的密碼體制,即“知彼”。人類有記載的通信密碼始於公元前400年。古希臘人是置換密碼的發明者。 1881年世界上的第一個電話保密專利出現。電報、無線電的發明使密碼學成為通信領域中不可迴避的研究課題。

在第二次世界大戰初期,德國軍方啟用“恩尼格瑪”密碼機,盟軍對德軍加密的信息有好幾年一籌莫展,“恩尼格瑪”密碼機似乎是不可破的。但是經過盟軍密碼分析學家的不懈努力,“恩尼格瑪”密碼機被攻破,盟軍掌握了德軍的許多機密,而德國軍方卻對此一無所知。

太平洋戰爭中,美軍破譯了日本海軍的密碼機,讀懂了日本艦隊司令官山本五十六發給各指揮官的命令,在中途島徹底擊潰了日本海軍,導致了太平洋戰爭的決定性轉折,而且不久還擊斃了山本五十六。相反軸心國中,只有德國是在第二次世界大戰的初期在密碼破譯方面取得過輝煌的戰績。因此,我們可以說,密碼學在戰爭中起著非常重要的作用。

編碼密碼學主要致力於信息加密、信息認證、數字簽名和密鑰管理方面的研究。信息加密的目的在於將可讀信息轉變為無法識別的內容,使得截獲這些信息的人無法閱讀,同時信息的接收人能夠驗證接收到的信息是否被敵方篡改或替換過;數字簽名就是信息的接收人能夠確定接收到的信息是否確實是由所希望的發信人發出的;密鑰管理是信息加密中最難的部分,因為信息加密的安全性在於密鑰。歷史上,各國軍事情報機構在獵取別國的密鑰管理方法上要比破譯加密算法成功得多。

密碼分析學與編碼學的方法不同,它不依賴數學邏輯的不變真理,必須憑經驗,依賴客觀世界覺察得到的事實。因而,密碼分析更需要發揮人們的聰明才智,更具有挑戰性。

現代密碼學是一門迅速發展的應用科學。隨著因特網的迅速普及,人們依靠它傳送大量的信息,但是這些信息在網絡上的傳輸都是公開的。因此,對於關係到個人利益的信息必須經過加密之後才可以在網上傳送,這將離不開現代密碼技術。

1976年Diffie和Hellman在《密碼新方向》中提出了著名的DH密鑰交換協議,標誌著公鑰密碼體制的出現。 Diffie和Hellman第一次提出了不基於秘密信道的密鑰分發,這就是DH協議的重大意義所在。

PKI(Public Key Infrastructure)是一個用公鑰概念與技術來實施和提供安全服務的具有普適性的安全基礎設施。 PKI公鑰基礎設施的主要任務是在開放環境中為開放性業務提供數字簽名服務。

二十世紀六七十年代以來計算機和通信系統的普及,帶動了個人對數字信息保護及各種安全服務的需求。 IBM的Feistel在七十年代初期開始其工作,到1977年達到頂點:其研究成果被採納成為加密非分類信息的美國聯邦信息處理標準,即數據加密標準DES,歷史上最著名的密碼體制。

1977年,美國國家標準局公佈實施了“美國數據加密標(DES)”,軍事部門壟斷密碼的局面被打破,民間力量開始全面介入密碼學的研究和應用中。民用的加密產品在市場上已有大量出售,採用的加密算法有DES、IDEA、RSA等。

DES至今依然是世界範圍內許多金融機構進行安全電子商務的標準手段,是迄今為止世界上最為廣泛使用和流行的一種分組密碼算法。然而,隨著計算機硬件的發展及計算能力的提高,DES已經顯得不再安全。 1997年7月22日電子邊境基金學會(EFF)使用一台25萬美金的電腦在56小時內破譯了56位DES。 1998年12月美國決定不再使用DES。美國國家標準技術研究所(NIST)現在已經啟用了新的加密標準AES,它選用的算法是比利時的研究成果“Rijndael”。以上這兩個階段所使用的密碼體制都稱為是對稱密碼體制,因為這些體制中,加秘密鑰和解秘密鑰都是相同的,而進入密碼學發展的第三個階段,則出現了非對稱密碼體制——公鑰密碼體制。

現有的密碼體制千千萬萬,各不相同。但是它們都可以分為私鑰密碼體制(如DES密碼)和公鑰密碼(如公開密鑰密碼)。前者的加密過程和脫密過程相同,而且所用的密鑰也相同;後者,每個用戶都有公開秘密鑰。

【多鏈與非對稱加密】

對稱加密指的就是加密和解密使用同一個秘鑰,所以叫做對稱加密。對稱加密只有一個秘鑰,作為私鑰。常見的對稱加密算法:DES,AES,3DES等等。

非對稱加密指的是:加密和解密使用不同的秘鑰,一把作為公開的公鑰,另一把作為私鑰。公鑰加密的信息,只有私鑰才能解密。私鑰加密的信息,只有公鑰才能解密。常見的非對稱加密算法:RSA,ECC。

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

另一方面,甲方可以使用乙方的公鑰對機密信息進行簽名後再發送給乙方;乙方再用自己的私匙對數據進行驗簽。

甲方只能用其專用密鑰解密由其公用密鑰加密後的任何信息。非對稱加密算法的保密性比較好,它消除了最終用戶交換密鑰的需要。

非對稱密碼體制的特點:算法強度複雜、安全性依賴於算法與密鑰但是由於其算法複雜,而使得加密解密速度沒有對稱加密解密的速度快。對稱密碼體制中只有一種密鑰,並且是非公開的,如果要解密就得讓對方知道密鑰。所以保證其安全性就是保證密鑰的安全,而非對稱密鑰體制有兩種密鑰,其中一個是公開的,這樣就可以不需要像對稱密碼那樣傳輸對方的密鑰了。這樣安全性就大了很多。

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

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

其實EKT解決的一個核心問題是,目前Dapp的開發難度的問題如果使用以太坊的Solidity開發,需要學習以太坊的一整套邏輯,在復雜應用開發的時候需要考慮各種優化方案,同一個功能使用傳統C/S結構一天寫完的,用以太坊可能要寫幾週時間,對開發者來說很不友好。

例如針對C/S模型,要寫一個非對稱加密服務需要:

1. 設計一個服務端,可以計算出一對秘鑰pub/pri。將私鑰保密將公鑰公開。

2. 設計一個客戶端請求服務端時,拿到服務端的公鑰pub。

3. 客戶端通過AES計算出對稱加密的秘鑰X。然後使用pub將X進行加密。

4. 客戶端將加密後的密文發送給服務端。服務端通過pri解密獲得X。

5. 最後還要設計兩邊通訊機制,通過對稱密鑰X以對稱加密算法來加解密。

這一套流程若要Dapp/公鏈開發者寫出來,勢必在真正開發區塊鏈功能之前就已經被這些繁瑣但其實通用的步驟耗費過多精力和資源。

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

EKT主鏈上每個節點的公鑰都是公開的。這是一種兼顧效率、安全和去中心化的解決方案。 Token現在一般被定義成一個智能合約,但如果把它變成一個預先定義好事件的“對象”,這個“對象”可以有自己的參數(比如總量、共識機制等等),則會帶來更好的安全體驗。接受token的地址可以有兩種:普通的用戶地址和合約地址,合約地址收到token之後可以執行非圖靈完備的合約語言,進行簡單的狀態計算和token轉移。

以上就是我對區塊鏈密碼學的一些思考,和一些在設計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就是比特幣使用的加密方式。

【EKT的思考】

【EKT的思考】

【EKT的思考】

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

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

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

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

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

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

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

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的多鏈多共識時對建設非對稱加密底層的考慮。歡迎大家提出疑問,共同探討。


安全
歡迎加入Odaily官方社群