iT邦幫忙

2026 iThome 鐵人賽

DAY 16
0
Software Development

我是Java工程師,關於密碼學我想懂的不多系列 第 16 篇

Day15 - 對稱金鑰加密系統 - 操作模式 (三):CTR與GCM

  • 分享至 

  • xImage
  •  

前言

在前一章中,我們介紹了 CFB 與 OFB 模式。今天討論的 CTR(Counter Mode) 與 GCM(Galois/Counter Mode) 則是現代密碼學工程中最核心、最廣泛採用的兩種模式。

一、 計數器模式:CTR (Counter Mode)

在 CTR 模式下,加密引擎輸出的是「金鑰流(Keystream)」。此處加密引擎加密的對象不是明文資料,而是一個遞增的「計數器數字」。

1. 運算流程

  • 計數器建構:每個區塊由 Nonce(隨機數/初始向量) 與 Counter(遞增計數器) 組成唯一的輸入暫存器,並以||(串接符號)表示Nonce與Counter的串接。
  • 金鑰流生成:將計數器產生的值送入 AES 加密引擎,產出當前的金鑰流區塊Si。
  • 加密流程 (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
        密文 C1                       密文 C2                       密文 Cn
  • 解密流程 (Decryption)
    解密時底層演算法依然呼叫「AES 加密 (Encrypt)」,將產出的相同金鑰流與密文進行 XOR 運算即可還原明文。

2. 特性分析

  • 完全支援平行化運算(Parallel Processing):由於每一個區塊的計數器都是獨立且可預先算出的,加密與解密都可以交由多核心 CPU 或 GPU 同時平行計算,效能極高。
  • 支援隨機存取(Random Access):若只需讀取超大檔案中的第 N 個區塊,無需像 CBC 或 CFB 一樣從頭解密,直接計算Nonce || Counter n 得到金鑰流直接對密文Cn XOR即可立即解密該區塊。
  • 無需 Padding(填充):最終資料由 XOR 產生,長度與明文完全相同。
  • 致命風險(Nonce + Counter 重用):若在同一把 Key 下重複使用相同的 Nonce,會產生完全相同的金鑰流,導致攻擊者可透過密文 XOR 直接還原明文(即著名的 Nonce Reuse 漏洞)。

二、 伽羅瓦/計數器模式:GCM (Galois/Counter Mode)

GCM 是現代安全性最高的 AEAD(認證加密) 模式。在 GCM 模式下,AES 輸出的同樣是「金鑰流(Keystream)」,但操作模式在產出密文後,還必透過GHASH (Galois Hash)認證算法(雜湊函數)計算防篡改的「認證標籤(Auth Tag)」。什麼是GHASH呢?簡單的說就是結合金鑰的雜湊函數,必須有同一把金要與同樣的資料才能產生一樣的雜湊值,關於**AEAD(認證加密)**我們會在Day20在特別拿出來說,這邊專注GCM的流程即可。

1. 運算流程

GCM 結合了 CTR 模式加密 與基於伽羅瓦體的 GHASH 認證算法:

  • 第一步:加密資料(CTR 模式)
  • 第二步:計算認證標籤(GHASH)
    將附加資料(AAD,如 IP 標頭或 HTTP Header)與所有密文 C1...Cn 輸入至伽羅瓦體進行 GHASH 運算,最後與 AES 加密的第一個計數器遮罩進行 XOR 運算,生成認證標籤 T
===========================================================================================
                                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)

2. 特性分析

  • 同時提供機密性與完整性 (AEAD):能有效防範中間人篡改密文,並徹底免疫 Padding Oracle 攻擊與位元翻轉攻擊(Bit-flipping Attack)。
  • 支援附加資料認證 (AAD):允許只對部分資料(例如封包表頭 AAD)做認證而不加密,同時對內文(Payload)做加密與認證。
  • 硬體加速友善:GHASH 在現代 CPU 上具備專屬的硬體指令集(如 Intel 的 PCLMULQDQ),計算速度極快。
  • Nonce 重用代價極高:若 GCM 重用 Nonce,不僅會洩漏明文,還會直接倒推算出 GHASH Key H,導致攻擊者可以隨意偽造有效的認證標籤 T。

Reference

  • 密碼學導論課程 - 陳君明教授

上一篇
Day14 - 對稱金鑰加密系統 - 操作模式 (二):CFB與OFB
下一篇
Day16 - 對稱金鑰加密系統:DES 加密演算法
系列文
我是Java工程師,關於密碼學我想懂的不多 共 17 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言