實際工作和開發過程中,網絡通信過程中的數據傳輸和存儲大多需要經過嚴格的加解密設計,比如用戶的登陸與注冊,敏感信息傳輸,支付網站和銀行的交易信息,甚至為了防止被拖庫,數據庫的敏感信息存儲也需要經過精心的設計。在進行安全設計過程中,或多或少涉及到密碼學的一些概念,比如對稱加密算法,非對稱加密算法(也名公鑰算法),消息認證,Hash函數(也名散列函數或摘要算法),數字簽名(也名指紋或摘要),流密碼等。
一直以來,對於這些概念,你是否有一種模棱兩可,似懂非懂的感覺?下面咱們一起揭開密碼學這層神秘的面紗。
基本概念
密碼體制
密碼體制是滿足以下5個條件的五元組(P, C, K, E, D),滿足條件:
-
P(Plaintext)是可能明文的有限集(明文空間);
-
C(Ciphertext)是可能密文的有限集(密文空間);
-
K(Key)是一切可能密鑰構成的有限集(密鑰空間);
-
E(Encrtption)和D(Decryption)是分別由密鑰決定的所有加密算法和解密算法的集合;
-
存在:
\(k \in K\) ,有加密算法 \(e_k:P \rightarrow C\) , \(e_k \in E\);同時有由 $ {k_1} \in K$ 決定的解密算法 \(d_{k_1} : C \rightarrow P,d_{k_1} \in D\);滿足關系 \(d_{k_1} (e_k(x)) = x, x \in P\)。
密碼破譯
密碼破譯根本目的在於破譯出密鑰或密文,假設破譯者Oscar是在已知密碼體制的前提下來破譯Bob使用的密鑰。這個假設被稱為Kerckhoff准則,最常見的破解類型有如下5種,從1~5,Oscar的破譯難度逐漸降低。
- 唯密文攻擊:Oscar僅具有密文串c,Oscar只能通過統計特性分析密文串p的規律;
- 已知明文攻擊:Oscar具有一些明文串p和相應的密文c,{p,c}可以是{P,C}的任意非空子集;
- 選擇明文攻擊:Oscar可獲得對加密機的暫時訪問,因此他能選擇特定明文串p並構造出相應的密文串c;
- 選擇密文攻擊:Oscar可暫時接近解密機,因此他能選擇特定密文串c並構造出相應的明文串p。
- 選擇文本攻擊:Oscar可以制造任意明文(p) / 密文(c)並得到對應的密文(c) / 明文(p)。
加密算法
對稱加密算法
對稱加密算法的加密密鑰和解密密鑰相同,常見的對稱加密算法有:AES、DES、2DES、3DES、RC4、RC5、RC6,Blowfish和IDEA,目前使用最廣泛的是DES、AES。
非對稱加密算法(公鑰算法)
公鑰算法的加密算法和解密算法使用不同的密鑰,分別為公鑰和私鑰,這兩個密鑰中的任何一個都可以用來加密,而另一個用來解密。常見的公鑰算法有:橢圓曲線(ECC)、RSA、Diffie-Hellman、El Gamal(安全性建立在基於求解離散對數是困難的)、DSA(適用於數字簽名)。
公鑰算法的應用
- 發送方Bob用接收方Alice的公鑰對消息進行加密,接收方Alice用自己的私鑰進行解密,可提供消息傳輸過程中的保密性。
- 發送方Bob采用自己的私鑰對明文進行加密,雖然任何持有Bob公鑰的人都能夠解密,但是只有擁有Bob私鑰的人才能產生密文C,而Bob的私鑰只有自己知道,因此密文C也叫做數字簽名,數字簽名C可用於認證源和數據的完整性。
- 發送方Bob首先采用自己的私鑰對明文進行加密,然后使用接收方Alice的公鑰再進行一次加密后傳輸,則既可提供認證功能,又可提供消息傳輸過程中的保密性。
- 發送方Bob用接收方Alic的公鑰對自己的私鑰進行加密,然后發送給Alice,Alic用自己的私鑰解密即可得到發送方Bob的私鑰,從而實現密鑰交換功能。
另外需要說明一下,Diffie-Hellman的密鑰交換算法與此方法不同,如果你學過密碼學,應該清楚其中的差異。並且並不是所有的公鑰算法都支持加密/解密、數字簽名和密鑰交換功能,有的公鑰算法只支持其中的一種或兩種,下表列出部分公鑰算法鎖支持的應用。
算法 | 加密/解密 | 數字簽名 | 密鑰交換 |
---|---|---|---|
RSA 安全性建立在基於大素數分解是困難的 |
Y | Y | Y |
橢圓曲線/ECC 安全性建立在橢圓曲線對數問題之上 (即由kP和P確定k是困難的) |
Y | Y | Y |
Diff-Hellman 安全性建立在計算離散對數是很困難的 |
N | Y | Y |
DSS | N | Y | N |
Hash函數(散列函數或摘要函數)
Hash函數將可變長度的消息映射為固定長度的Hash值或消息摘要,常見的Hash算法有:MD2、MD4、MD5、SHA-1、SHA-224、SHA-256、SHA-384、SHA-512、HAVAL、HMAC、HMAC-MD5、HMAC-SHA1。對於給定的密碼學Hash函數y=Hash(x),要求如下兩種情況再計算上不可行:
- 對給定的y,找到對應的x;
- 找到兩個不同的x1和x2,使得Hash(x1)=Hash(x2),具有抗碰撞性的特點。
Hash函數的應用
- 消息認證是用來驗證消息完整性的一種機制或服務,消息認證確認收到的數據確實和發送時的一樣(即防篡改),並且還要確保發送方的身份是真實有效的的(即防冒充)。下圖以對稱加密算法為例,因為對稱密鑰K只有Bob和Alice才有,保證了發送方的合法有效性,同時比較C3與C是否相等,可以確定傳輸過程中是否被篡改過。
- 數字簽名(也名指紋或摘要)是一種認證機制,它使得消息的產生者可以添加一個起簽名作用的碼字,通過計算消息的Hash值並用產生者的私鑰加密Hash值來生成簽名,簽名保證了消息和來源和完整性。下圖最后一步比較C3與C如果不相等,認證失敗,該圖沒有提供保密性,因為傳輸過程中只是將P和C1簡單的連接在一起,並沒有對C2進行加密,如果需要提供保密性,可以使用Alic的私鑰對C2加密后再傳輸。
- 用於產生單向口令文件,比如操作系統存儲的都是口令的Hah值而不是口令本身,當用戶輸入口令時,計算其Hash值和之前存儲的口令比對,這樣即使操作系統被黑之后,也能保證用戶口令的安全性。同樣適用於入侵檢測和病毒檢測,如將你需要保護的文件的Hash值存儲到安全系統中(比如只讀設備中,不可修改也不可刪除),這樣病毒入侵后只能修改文件而不能修改Hash值,於是可以通過重新計算文件的Hash值和之前保存的Hash值比對。
加密方式
流密碼
典型的流密碼是每次加密一個字節的密文,加密長度可以按需求設計,比如每次只加密一位或者大於一個字節的單元都行。實質上\(Ci=Pi \oplus K1i,Pi=Ci \oplus K2i\),就是簡單的異或,加密異或一次,解密再異或一次,即可恢復明文字節流。
參考文獻
[1] MathJax語法規則
[2] Mermaid語法規則
[3] Mermaid官方教程
[4] Mermaid Github倉庫
[5] MathJax Github倉庫
[6] 常用加密算法概述
[7] HTTPS建立過程