本文內容來自:《區塊鏈技術指南》部分,特此說明。
hash 演算法
定義
hash (雜湊或散列)演算法是資訊技術領域非常基礎也非常重要的技術。它能任意長度的二進位值(明文)映射為較短的固定長度的二進位值(hash 值),並且不同的明文很難映射為相同的 hash 值。
例如計算一段話“hello blockchain world, this is yeasy@github”的 md5 hash 值為 89242549883a2ef85dc81b90fb606046。
$ echo “hello blockchain world, this is yeasy@github”|md5
89242549883a2ef85dc81b90fb606046
這意味著我們只要對某檔案進行 md5 hash 計算,得到結果為 89242549883a2ef85dc81b90fb606046,這就說明檔案內容極大機率上就是 “hello blockchain world, this is yeasy@github”。可見,hash 的核心思想十分類似於基於內容的編址或命名。
註:md5 是一個經典的 hash 演算法,其和 SHA-1 演算法都已被 證明 安全性不足應用於商業情境。
一個優秀的 hash 演算法,將能實現:
正向快速:給定明文和 hash 演算法,在有限時間和有限資源內能計算出 hash 值。
逆向困難:給定(若干) hash 值,在有限時間內很難(基本不可能)逆推出明文。
輸入敏感:原始輸入資訊修改一點資訊,產生的 hash 值看起來應該都有很大不同。
衝突避免:很難找到兩段內容不同的明文,使得它們的 hash 值一致(發生衝突)。
衝突避免有時候又被稱為“抗碰撞性”。如果給定一個明文前提下,無法找到碰撞的另一個明文,稱為“抗弱碰撞性”;如果無法找到任意兩個明文,發生碰撞,則稱演算法具有“抗強碰撞性”。
流行的演算法
目前流行的 hash 演算法包括 MD5(已被證明不夠安全)和 SHA-1,兩者均以 MD4 為基礎設計的。
MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年設計的,MD 是 Message Digest 的縮寫。其輸出為 128 位。MD4 並不足夠安全。
MD5(RFC 1321)是 Rivest 於1991年對 MD4 的改進版本。它對輸入仍以 512 位分組,其輸出是 128 位。MD5 比 MD4 複雜,並且計算速度要慢一點,但更安全一些。MD5 並不足夠安全。
SHA1 (Secure Hash Algorithm)是由 NIST NSA 設計,它的輸出為長度 160 位的 hash 值,因此抗窮舉性更好。SHA-1 設計時基於和 MD4 相同原理,並且模仿了該演算法。
為了提高安全性,NIST NSA 還設計出了 SHA-224、SHA-256、SHA-384,和 SHA-512 演算法(統稱為 SHA-2),跟 SHA-1 演算法原理類似。
效能
一般的,hash 演算法都是算力敏感型,意味著計算資源是瓶頸,主頻越高的 CPU 進行 hash 的速度也越快。
也有一些 hash 演算法不是算力敏感的,例如 scrypt,需要大量的記憶體資源,節點不能通過簡單的增加更多 CPU 來獲得 hash 效能的提升。
數字摘要
顧名思義,數字摘要是對數字內容進行 hash 運算,擷取唯一的摘要值來指代原始數字內容。
數字摘要是解決確保內容沒被篡改過的問題(利用 hash 函數的抗碰撞性特點)。
數字摘要是 hash 演算法最重要的一個用途。
在網路上下載軟體或檔案時,往往同時會提供一個數字摘要值,使用者下載下來原始檔案可以自行進行計算,並同提供的摘要值進行比對,以確保內容沒有被修改過。
密碼編譯演算法
公開金鑰私密金鑰體系
現代密碼編譯演算法的典型組件包括:加解密演算法、公開金鑰、私密金鑰。
加密過程中,通過密碼編譯演算法和公開金鑰,對明文進行加密,獲得密文。
解密過程中,通過解密演算法和私密金鑰,對密文進行解密,獲得明文。
根據公開金鑰和私密金鑰是否相同,演算法可以分為對稱式加密和非對稱式加密。兩種模式適用於不同的需求,恰好形成互補,很多時候也可以組合使用,形成組合機制。
對稱式加密
顧名思義,公開金鑰和私密金鑰是相同的。
優點是加解密速度快,空間佔用小,保密強度高。
缺點是參與多方都需要持有密鑰,一旦有人泄露則安全性被破壞;另外如何其它分發密鑰也是個問題。
代表演算法包括 DES、3DES、AES、IDEA 等。
適用於大量資料的加解密,不能用於簽名情境。
非對稱式加密
顧名思義,公開金鑰和私密金鑰是不同的。
公開金鑰一般是公開的,人人可擷取的,私密金鑰一般是個人自己持有,不能被他人擷取。
優點是公私密金鑰分開,容易管理,並且容易完成密鑰分發。
缺點是加解密速度慢。
代表演算法包括:RSA、ElGamal、橢圓曲線系列演算法。
一般適用於簽名情境或密鑰協商,不適於大量資料的加解密。
組合機制
即先用計算複雜度高的非對稱式加密協商一個臨時的對稱式加密密鑰(工作階段金鑰),然後雙方再通過對稱式加密對傳遞的大量資料進行加解密處理。
數位簽章和數位憑證
數位簽章
類似在紙質合約上籤名確認合約內容,數位簽章用於證實某數字內容的完整性和來源。
A 發給 B 一個檔案。A 先對檔案進行摘要,然後用自己的私密金鑰進行加密,將檔案和加密串都發給 B。B 收到後檔案和加密串,用 A 的公開金鑰來解密加密串,得到原始的數字摘要,跟對檔案進行摘要後的結果進行比對。如果一致,說明該檔案確實是 A 發過來的,並且檔案內容沒有被修改過。
多重簽名
n 個持有人中,收集到至少 m 個( n≥m≥1 n\ge{}m\ge{}1)的簽名,即認為合法,這種簽名被稱為多重簽名。
其中,n 是提供的公開金鑰個數,m 是需要匹配公開金鑰的最少的簽名個數,
群簽名
環簽名
環簽名由 Rivest,shamir 和 Tauman 三位密碼學家在 2001 年首次提出。環簽名屬於一種簡化的群簽名。
簽名者首先選定一個臨時的簽名者集合,集合中包括簽名者自身。然後簽名者利用自己的私密金鑰和簽名集合中其他人的公開金鑰就可以獨立的產生簽名,而無需他人的協助。簽名者集合中的其他成員可能並不知道自己被包含在其中。
數位憑證
數位憑證用來證明某個公開金鑰是誰的。
對於數位簽章應用來說,很重要的一點就是公開金鑰的分發。一旦公開金鑰被人替換,則整個安全體系將被破壞掉。
怎麼確保一個公開金鑰確實是某個人的原始公開金鑰。
這就需要數位憑證機制。
顧名思義,數位憑證就是像一個認證一樣,證明資訊和合法性。由認證認證機構(Certification Authority,CA)來簽發。
數位憑證內容可能包括版本、序號、簽名演算法類型、簽發者資訊、有效期間、被簽發人、簽發的公開密鑰、CA 數位簽章、其它資訊等等。
其中,最重要的包括 簽發的公開密鑰、CA 數位簽章 兩個資訊。因此,只要通過這個認證就能證明某個公開金鑰是合法的,因為帶有 CA 的數位簽章。
更進一步地,怎麼證明 CA 的簽名合法不合法呢。
類似的,CA 的數位簽章合法不合法也是通過 CA 的認證來證明的。主流作業系統和瀏覽器裡面會提前預置一些 CA 的認證(承認這些是合法的認證),然後所有基於他們認證的簽名都會自然被認為合法。
後面章節將介紹的 PKI 體系提供了一套完整的認證管理的架構。
PKI 體系
PKI (Public Key Infrastructure)體系不代表某一種技術,而是綜合多種密碼學手段來實現安全可靠傳遞訊息和身份確認的一個架構和規範。
一般情況下,包括如下組件:
CA(Certification Authority):負責認證的頒發和作廢,接收來自 RA 的請求;
RA(Registration Authority):對使用者身份進行驗證,校正資料合法性,負責登記,審核過了就發給 CA;
認證資料庫:存放認證,一般採用 LDAP 目錄服務,標準格式採用 X.500 系列。
CA 是最核心的組件,主要完成對公開金鑰的管理。從之前章節內容中,我們介紹過,密鑰有兩種類型:用於簽名和用於加解密,對應稱為 簽名金鑰組 和 加密金鑰對。
使用者基於 PKI 體系要申請一個認證,一般可以由 CA 來產生認證和私密金鑰,也可以自己產生公開金鑰和私密金鑰,然後由 CA 來對公開金鑰進行簽發。
默克爾樹(又叫雜湊樹)是一種二叉樹,由一個根節點、一組中間節點和一組分葉節點組成。最下面的分葉節點包含儲存資料或其雜湊值,每個中間節點是它的兩個孩子節點內容的雜湊值,根節點也是由它的兩個子節點內容的雜湊值組成。
進一步的,默克爾樹可以推廣到多叉樹的情形。
默克爾樹的特點是,底層資料的任何變動,都會傳遞到其父親節點,一直到樹根。
默克爾樹的典型應用情境包括:
快速比較大量資料:當兩個默克爾樹根相同時,則意味著所代表的資料必然相同。
快速定位修改:例如上例中,如果 D1 中資料被修改,會影響到 N1,N4 和 Root。因此,沿著 Root –> N4 –> N1,可以快速定位到發生改變的 D1;
零知識證明:例如如何證明某個資料(D0……D3)中包括給定內容 D0,很簡單,構造一個默克爾樹,公布 N0,N1,N4,Root,D0 擁有者可以很容易檢測 D0 存在,但不知道其它內容。
同態加密
定義
同態加密(Homomorphic Encryption)是一種特殊的加密方法,允許對密文進行處理得到仍然是加密的結果,即對密文直接進行處理,跟對明文進行處理再加密,得到的結果相同。從代數的角度講,即同態性。
如果定義一個運算子 △ \triangle{},對密碼編譯演算法 E 和 解密演算法 D,滿足:
$$ E(X\triangle{}Y) = E(X)\triangle{} E(Y)
$$ 則意味著對於該運算滿足同態性。
同態性在代數上包括:加法同態、乘法同態、減法同態和除法同態。同時滿足加法同態和乘法同態,則意味著是 代數同態,即 全同態。同時滿足四種同態性,則被稱為 算數同態。
曆史
同態加密的問題最早是由 Ron Rivest、Leonard Adleman 和 Michael L. Dertouzos 在 1978 年提出,但 第一個“全同態”的演算法 到 2009 年才被克雷格·金特裡(Craig Gentry)證明。
僅滿足加法同態的演算法包括 Paillier 和 Benaloh 演算法;僅滿足乘法同態的演算法包括 RSA 和 ElGamal 演算法。
同態加密在雲時代的意義十分重大。目前,從安全形度講,使用者還不敢將敏感資訊直接放到第三方雲上進行處理。如果有了比較實用的同態加密技術,則大家就可以放心的使用各種雲端服務了。
遺憾的是,目前已知的同態加密技術需要消耗大量的計算時間,還遠達不到實用的水平。
函數加密
與同態加密相關的一個問題是函數加密。
同態加密保護的是資料本身,而函數加密顧名思義保護的是處理函數本身,即讓第三方看不到處理過程的前提下,對資料進行處理。
該問題已被證明是不存在對多個通用函數的任意多 key 的方案,目前僅能做到對某個特定函數的一個 key 的方案。
零知識證明(zero knowledge validation)
證明者在不向驗證者提供任何有用的資訊的前提下,使驗證者相信某個論斷是正確的。
例如,A 像 B 證明自己有一個物品,但 B 無法拿到這個物品,無法用 A 的證明去向別人證明自己也擁有這個物品。