Encryption
加密(Encryption)是將明文轉換為密文的過程,需要金鑰才能還原。
Block Cipher 區塊加密
區塊加密將資料分成固定大小的區塊(如 AES 為 16 bytes),逐塊進行加密。
加密模式比較
Mode of Operations: ECB / CBC / CFB / OFB / CTR / GCM
| AES Mode | 是否需 Padding | 加密後長度特性 | 解密是否需 Unpad | 是否需 IV | 是否支援 AAD | 加密後輸出組成 | 備註 |
|---|---|---|---|---|---|---|---|
| ECB | ✅ 需要 | Block Size 倍數(16n) | ✅ 需要 | ❌ 不需 | ❌ 不支援 | Ciphertext | 每個 block 獨立 → 同樣明文會產生同樣密文,容易遭模式分析攻擊,不建議使用 |
| CBC | ✅ 需要 | Block Size 倍數(16n) | ✅ 需要 | ✅ 需要 | ❌ 不支援 | IV + Ciphertext | 初始 IV 為隨機生成,解密時需帶入,安全性比 ECB 高 |
| CFB | ❌ 不需要 | 原文等長(n) | ❌ 不需要 | ✅ 需要 | ❌ 不支援 | IV + Ciphertext | 適合逐字節串流加密,加密時使用上個密文塊作為輸入 |
| OFB | ❌ 不需要 | 原文等長(n) | ❌ 不需要 | ✅ 需要 | ❌ 不支援 | IV + Ciphertext | 類似 CFB,但使用加密後的 IV 為下一次輸入,穩定性較好 |
| CTR | ❌ 不需要 | 原文等長(n) | ❌ 不需要 | ✅ 需要(Counter) | ❌ 不支援 | Nonce + Counter + Ciphertext | 將 block cipher 模擬成 stream cipher,支援非同步加解密 |
| GCM | ❌ 不需要 | 原文等長 + 16 bytes Tag | ❌ 不需要 | ✅ 需要 | ✅ 支援 | IV + Ciphertext + Tag | 加密與認證(AEAD),支援 AAD,最適合 API / JWT / HTTPS 等安全傳輸場景 |
名詞說明
| 名詞 | 說明 |
|---|---|
| IV(Initialization Vector) | 初始向量,用於保證同樣明文每次加密結果不同,通常為隨機產生 |
| Padding | 為了湊齊 16 bytes,使用 PKCS#7 / ZeroPadding 等方式填充 |
| Tag(驗證碼) | GCM 模式下用來驗證密文與 AAD 是否被竄改,解密時若驗證失敗將拋錯 |
| AAD(Additional Authenticated Data) | 附加驗證資料,不會被加密,但會被簽章驗證(如 API header、使用者 ID 等) |
| Nonce / Counter | CTR / GCM 模式中的計數器(或隨機值),與 IV 角色類似,但可預測及遞增 |
模式選擇建議
| 應用場景 | 建議使用的模式 |
|---|---|
| 靜態資料加密(不常變) | CBC + PKCS7 padding(需管理 IV) |
| 動態傳輸(API / Websocket) | ✅ GCM(帶驗證 Tag,安全性高) |
| 需要非同步加解密(多線程 / 快取) | ✅ CTR / GCM |
| 硬體加速支援場景 | ✅ GCM(幾乎所有現代硬體/SDK 都支援) |
| 保密性需求但不怕重複密文 | 可用 CFB / OFB |
加密模式圖解
ECB(Electronic CodeBook Mode)
Plain Block 1 Plain Block 2 Plain Block 3
| | |
v v v
+----------+ +----------+ +----------+
| Encrypt | | Encrypt | | Encrypt |
+----------+ +----------+ +----------+
| | |
v v v
Cipher Block 1 Cipher Block 2 Cipher Block 3每個區塊獨立加密,相同明文產生相同密文,容易被分析。
CBC(Cipher Block Chaining Mode)
IV -----> XOR <---- Plain Block 1
|
v
+----------+
| Encrypt |
+----------+
|
v
Cipher Block 1 -----> XOR <---- Plain Block 2
|
v
+----------+
| Encrypt |
+----------+
|
v
Cipher Block 2 -----> XOR <---- Plain Block 3
|
v
+----------+
| Encrypt |
+----------+
|
v
Cipher Block 3每個區塊的加密依賴前一個密文區塊,需要 IV 來初始化。
Stream Cipher 串流加密
串流加密逐位元或逐字節處理資料,適合即時加密場景。CTR 模式可將 Block Cipher 模擬成 Stream Cipher。
MAC(Message Authentication Code)
訊息驗證碼用於確認訊息的完整性和來源真實性。
- HMAC:使用雜湊函數(如 HMAC-SHA256)
- CMAC:使用區塊加密(如 AES-CMAC)
GCM 模式內建 MAC 功能,提供 AEAD(Authenticated Encryption with Associated Data)。
E2EE(End-to-End Encryption)
端對端加密確保只有通訊雙方可以讀取訊息內容,中間的伺服器無法解密。
常見應用:
- 即時通訊(Signal、WhatsApp)
- 安全郵件(ProtonMail)
- 視訊會議(Zoom E2EE)