在前一章中,我們介紹了 CFB 與 OFB 模式。今天討論的 CTR(Counter Mode) 與 GCM(Galois/Counter Mode) 則是現代密碼學工程中最核心、最廣泛採用的兩種模式。
在 CTR 模式下,加密引擎輸出的是「金鑰流(Keystream)」。此處加密引擎加密的對象不是明文資料,而是一個遞增的「計數器數字」。
[ Nonce || Counter 1 ] [ Nonce || Counter 2 ] [ Nonce || Counter n ]
| | |
v v v
+---------------+ +---------------+ +---------------+
Key | AES Encrypt | Key | AES Encrypt | Key | AES Encrypt |
--->+---------------+ --->+---------------+ --->+---------------+
| | |
v 金鑰流 S1 v 金鑰流 S2 v 金鑰流 Sn
明文 P1 ->(+) 明文 P2 ->(+) 明文 Pn ->(+)
| | |
v v v
密文 C1 密文 C2 密文 Cn
GCM 是現代安全性最高的 AEAD(認證加密) 模式。在 GCM 模式下,AES 輸出的同樣是「金鑰流(Keystream)」,但操作模式在產出密文後,還必透過GHASH (Galois Hash)認證算法(雜湊函數)計算防篡改的「認證標籤(Auth Tag)」。什麼是GHASH呢?簡單的說就是結合金鑰的雜湊函數,必須有同一把金要與同樣的資料才能產生一樣的雜湊值,關於**AEAD(認證加密)**我們會在Day20在特別拿出來說,這邊專注GCM的流程即可。
GCM 結合了 CTR 模式加密 與基於伽羅瓦體的 GHASH 認證算法:
===========================================================================================
GCM (Galois/Counter Mode) 運轉架構圖
===========================================================================================
【第一階段:資料加密 (CTR Mode Encryption)】
[ Nonce || Counter 1 ] [ Nonce || Counter 2 ] [ Nonce || Counter n ]
| | |
v v v
+---------------+ +---------------+ +---------------+
Key | AES Encrypt | Key | AES Encrypt | Key | AES Encrypt |
--->+---------------+ --->+---------------+ --->+---------------+
| | |
v 金鑰流 S1 v 金鑰流 S2 v 金鑰流 Sn
明文 P1 ->(+) 明文 P2 ->(+) 明文 Pn ->(+)
| | |
+----------+ +----------+ +----------+
| | | | | |
v v v v v v
密文 C1 (至GHASH) 密文 C2 (至GHASH) 密文 Cn (至GHASH)
-------------------------------------------------------------------------------------------
【第二階段:完整性驗證標籤生成 (GHASH Authentication Tag Generation)】
附加資料 AAD 密文 C1 密文 C2 長度區塊 (Len A || Len C)
| | | |
v v v v
+--------------+ +--------------+ +--------------+ +--------------+
| AAD Block | | Cipher Block | | Cipher Block | ... | Length Block |
+--------------+ +--------------+ +--------------+ +--------------+
| | | |
+--------------------+--------------------+----------------------------+
|
v
+--------------------------------------+
| GHASH 運算 (於 GF(2^128)) | <--- 雜湊金鑰 H = E_K(0^128)
+--------------------------------------+
|
v
GHASH 最終結果 (GTAG)
|
(+) <--- 加密遮罩: E_K(Nonce || Counter 0)
|
v
認證標籤 Auth Tag (T)
PCLMULQDQ),計算速度極快。