一、前言
AES 分為 AES-128、AES-192、AES-256 三種規格,主要差異在原始金鑰長度(Key Size)、運算輪數(Nr)與金鑰展開規則。無論使用哪一種 AES,Block Size 都固定為 128 bits(16 Bytes)。
AES Core 內部將資料表示為 4 × 4 Bytes 的 State Matrix,再藉由一系列 Transformation 完成加密與解密。本系列以 FIPS 197 為主要依據,說明核心演算法、公式符號與可追蹤的計算範例。
二、AES-128/192/256 規格比較
| 項目 | AES-128 | AES-192 | AES-256 |
|---|---|---|---|
| Block Size | 128 bits | 128 bits | 128 bits |
| Key Size | 128 bits | 192 bits | 256 bits |
| Nb(State Words) | 4 | 4 | 4 |
| Nk(Key Words) | 4 | 6 | 8 |
| Nr(Rounds) | 10 | 12 | 14 |
| State Size | 16 Bytes | 16 Bytes | 16 Bytes |
| Round Key Size | 16 Bytes | 16 Bytes | 16 Bytes |
| Round Key 數量 | 11 | 13 | 15 |
| Key Schedule | 44 Words | 52 Words | 60 Words |
Nb:State 包含的 32-bit Words 數量,AES 固定為 4
Nk:原始 Key 包含的 32-bit Words 數量
Nr:AES 標準規定的加/解密輪數。
重點:Cipher 在第一輪前先執行 Initial AddRoundKey,因此總共需要 Nr + 1 組 Round Keys;最前面的 Initial AddRoundKey 不計入 Nr。
NIST 對照:FIPS 197 §5、Table 3。
三、關鍵名詞
| 名詞 | 說明 |
|---|---|
| Bit | 最小的二進位資料單位,數值為 0 或 1。 |
| Byte | 8 bits;可表示 0x00~0xFF 共 256 種值。 |
| Word | 32 bits = 4 Bytes。 |
| Block | AES 單次加密/解密的資料區塊,固定 128 bits = 16 Bytes。 |
| State | AES Core 的內部運算狀態,以 4 × 4 Bytes 矩陣表示。 |
| Original Key | AES 加解密使用的原始金鑰。 |
| Key Schedule | KeyExpansion 產生的完整 Word 序列。 |
| Round Key | 從 Key Schedule 取出 4 個連續 Words,固定 16 Bytes。 |
| Round | AES 加密或解密的一輪運算。 |
| Transformation | 對 State 執行的資料轉換運算。 |
| S-Box | SubBytes 使用的非線性位元組替換表。 |
| Rcon | Key Expansion 使用的固定輪常數。 |
| GF(2⁸) | 含 256 個元素的有限體,供 AES 特定數學運算使用。 |
Block vs State:Block 表示單次處理的資料長度;State 表示這 16 Bytes 在 AES Core 中的運算形式。兩者大小相同,但定義不同。
四、State Matrix 的資料排列
AES 的輸入是連續 16 Bytes,進入 AES Core 後採 Column-major(欄優先)順序載入 4 × 4 State Matrix。
Input Block = 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF| Row / Column | Col 0 | Col 1 | Col 2 | Col 3 |
|---|---|---|---|---|
| Row 0 | 00 | 44 | 88 | CC |
| Row 1 | 11 | 55 | 99 | DD |
| Row 2 | 22 | 66 | AA | EE |
| Row 3 | 33 | 77 | BB | FF |
s[r,c] = in[r + 4c]r = 0~3;c = 0~3;各個索引自 0 開始符號說明:s[r,c] 是第 r 列、第 c 欄的 State Byte;in[i] 是輸入 Block 的第 i 個 Byte;r 為 Row Index;c 為 Column Index。
例如:s[1,2] = in[1 + 4 × 2] = in[9] = 0x99
NIST 對照:FIPS 197 §3.4,Equations (3.6)、(3.7),Figure 1。
五、常用計算符號與索引
| 符號/寫法 | 名稱 | 定義 |
|---|---|---|
| s[r,c] | State Element | 運算前第 r 列、第 c 欄的 Byte。 |
| s′[r,c] | Updated State | 運算後對應位置的 Byte。 |
| w[i] | Word | Key Schedule 的第 i 個 32-bit Word。 |
| Nk | Key Words | 原始 Key 的 Word 數量。 |
| Nb | Block Words | State 的 Word 數量(固定 4)。 |
| Nr | Rounds | AES 的加/解密輪數。 |
| i | Word Index | 展開金鑰時的 Word 索引。 |
| r / c | Row / Column | State 的列/欄索引,0~3。 |
| j | Constant Index | 依上下文使用,例如 Rcon[j]。 |
| ⊕ | XOR | 互斥或;相同 bit 為 0,不同 bit 為 1。 |
| • | Field Multiply | GF(2⁸) 有限體乘法。 |
| mod | Modulo | 取模/取餘數,依運算對象解讀。 |
| b⁻¹ | Inverse | GF(2⁸) 中非零元素 b 的乘法反元素。 |
| b̃ | Intermediate Byte | S-Box 仿射轉換前的中間 Byte。 |
| Rcon[j] | Round Constant | Key Expansion 中第 j 個輪常數。 |
避免誤解:索引 i、r、c 通常從 0 開始;Rcon[j] 的 j 從 1 開始。符號 • 是有限體乘法,不是一般整數乘法。
六、AES 使用的基本數學運算
XOR(Exclusive-OR)
XOR 對應位置的 bit 執行互斥或:兩個 bit 不同時輸出 1,相同時輸出 0。
0x53 ⊕ 0xCA = 0x99XOR 具有自反性,因此 AddRoundKey 可以使用同一個 Round Key 再 XOR 一次還原資料:
(A ⊕ K) ⊕ K = AGF(2⁸) 有限體運算
AES 將一個 Byte 視為 GF(2⁸) 的元素,並可用二進位係數多項式表示,其中每個係數 b₀~b₇ 都只能是 0 或 1。
b(x) = b₇x⁷ + b₆x⁶ + ··· + b₁x + b₀例如,0x53 = 01010011₂,其中第 6、4、1、0 位元為 1:
0x53 ↔ x⁶ + x⁴ + x + 1AES 在 GF(2⁸) 乘法中使用固定不可約多項式:
m(x) = x⁸ + x⁴ + x³ + x + 1 ↔ 0x11B- 加法/減法:同次項係數使用 XOR。
- 乘法:多項式相乘後,對 m(x) 進行模約簡。
- 乘法反元素:對非零 b,尋找滿足 b • b⁻¹ = 0x01 的元素。
GF(2⁸) 乘法主要用於 SubBytes 的 S-Box 定義、MixColumns 及 Rcon 的生成;並非每個 AES Transformation 都要執行有限體乘法。
NIST 對照:FIPS 197 §4.1~§4.4。
(三)Hexadecimal(十六進位)
AES 規範與測試資料常使用十六進位數值表示 Byte:
| 表示方式 | 相同數值 |
|---|---|
| Binary | 01010011 |
| Hex | 0x53 |
| Decimal | 83 |
| NIST Byte Notation | {53} |
一個 Hex 字元對應 4 bits,因此兩個 Hex 字元代表 1 Byte。後續數值驗算原則上使用 Hex,必要時再展開為 Binary 解釋 XOR、位移或 GF(2⁸) 運算。
七、AES Core 的主要演算法
AES Core 可以區分為三個主要演算法:
| 演算法 | 功能 |
|---|---|
| KeyExpansion() | 將 Original Key 展開為完整 Key Schedule。 |
| Cipher() | 依照 Round Keys 與 State 執行加密流程。 |
| InvCipher() | 依照 Round Keys 與 State 執行解密流程。 |
其中,Cipher() 主要使用以下四個 Transformation:
| Transformation | 主要功能 |
|---|---|
| SubBytes() | 使用 S-Box 逐 Byte 進行非線性替換。 |
| ShiftRows() | 依列索引對 State 各列執行循環位移。 |
| MixColumns() | 使用固定矩陣混合每一欄資料。 |
| AddRoundKey() | 讓 State 與對應 Round Key 逐 Byte XOR。 |
KeyExpansion() 負責提供 AddRoundKey() 所需的 Round Keys;Cipher() 依照 Initial Round、Main Rounds、Final Round 的規則決定各項 Transformation 的順序。
架構提醒:Cipher() 與 InvCipher() 分別是加密與解密流程,不是依序接續執行的兩個階段。
八、本章重點整理
- AES-128、AES-192、AES-256 的差異主要在 Key Size、Nr 與 Key Expansion 規則。
- AES 的 Block Size 與 State Size 均固定為 128 bits(16 Bytes)。
- State 使用 4 × 4 Bytes 的 Column-major 排列,索引 r、c 均由 0 開始。
- Original Key 與 Round Key 不同;每組 Round Key 都固定為 4 Words(16 Bytes)。
- KeyExpansion() 產生 Round Keys,供 Cipher() 與 InvCipher() 使用。
- AES 使用 XOR、GF(2⁸) 乘法及模約簡;不能將有限體乘法當成一般整數乘法。
九、參考資料
NIST, Advanced Encryption Standard (AES), FIPS 197, Updated May 9, 2023.
本章對照:§2 Definitions、§3 Notation and Conventions、§4 Mathematical Preliminaries、§5 Algorithm Specifications、Table 3、Figure 1。

