你的 HTTPS 連線、手機儲存、Wi-Fi 密碼、ZIP 壓縮檔保護——幾乎所有現代加密場景的核心都是同一個演算法:AES(Advanced Encryption Standard)。它是 2001 年由 NIST 選定的對稱加密標準,至今仍被視為無法破解的實用加密基石。理解 AES 的運作方式,是每位開發者和資安從業者的必備知識。
1. AES 的由來
1997 年,NIST(美國國家標準與技術研究院)宣布舉辦公開競賽,尋找 DES(Data Encryption Standard)的繼任者。DES 的 56 位元金鑰在 1999 年被以 22 小時暴力破解,已不敷使用。
歷經五年、全球密碼學家的公開審查,2001 年 NIST 選定由比利時密碼學家 Joan Daemen 和 Vincent Rijmen 設計的 Rijndael 演算法,正式命名為 AES,發布為 FIPS PUB 197 標準。
AES 是對稱加密:加密和解密使用同一把金鑰。相對地,RSA 是非對稱加密,使用公鑰加密、私鑰解密。HTTPS 實際上是兩者結合:用 RSA/ECDH 安全交換 AES 金鑰,再用 AES 加密實際傳輸的資料。
2. AES 的金鑰長度
AES 支援三種金鑰長度,安全性依序遞增:
| 金鑰長度 | 回合數 | 安全等級 | 主要用途 |
|---|---|---|---|
| AES-128 | 10 回合 | 128 位元 | 一般消費性應用、TLS |
| AES-192 | 12 回合 | 192 位元 | 較少使用 |
| AES-256 | 14 回合 | 256 位元 | 政府機密、高安全性需求 |
AES-128 對絕大多數應用已綽綽有餘——暴力破解需嘗試 2¹²⁸ 種組合,以現有算力約需宇宙年齡的倍數。AES-256 常見於合規要求(如美國政府 TOP SECRET 資料必須使用 AES-256)。
3. AES 如何運作
AES 以 128 位元(16 位元組)為一個區塊處理資料。金鑰長度決定回合數,每回合執行四個步驟:
3.1 四個核心步驟
- SubBytes(位元組替換):將每個位元組透過固定的 S-Box 查表替換,提供非線性混淆
- ShiftRows(列移位):將 4×4 位元組矩陣的各列循環左移不同位數,打散資料位置
- MixColumns(行混合):對每行進行有限域乘法運算,使各位元組互相影響(最後一回合省略)
- AddRoundKey(加入回合金鑰):將當前狀態與由主金鑰衍生的回合金鑰做 XOR 運算
這四個步驟的組合確保了 AES 的兩個核心密碼學特性:混淆(Confusion)讓密文與金鑰的關係盡量複雜,擴散(Diffusion)讓明文的一個位元變化影響到密文的大量位元。
4. 加密模式:最關鍵的選擇
AES 本身只定義如何加密單一 128 位元區塊。面對任意長度的資料,需要選擇「加密模式」來決定多個區塊如何串聯。這個選擇比金鑰長度更重要。
4.1 ECB(電子密碼本模式)— 永遠不要用
ECB 是最簡單的模式:每個區塊獨立加密。這帶來致命弱點:相同的明文區塊產生相同的密文區塊。
用 ECB 加密一張企鵝圖片,加密後仍能清楚看出企鵝輪廓——因為圖片中顏色相同的像素區域會產生相同的密文,保留了原始資料的模式。ECB 在任何需要保密的場景都不應使用。
4.2 CBC(密文區塊串聯模式)— 傳統選擇
CBC 在加密前將每個明文區塊與前一個密文區塊做 XOR,第一個區塊則與隨機生成的 IV(初始化向量)做 XOR。相同的明文在不同 IV 下產生不同密文。
- 需要 Padding:若資料長度不是 16 位元組的倍數,需補足(常用 PKCS#7)
- 解密可並行,但加密不能並行(每個區塊依賴前一個)
- 弱點:CBC 本身不提供完整性驗證,容易受到 Padding Oracle 攻擊
4.3 CTR(計數器模式)— 讓 AES 成為串流加密
CTR 模式不直接加密明文,而是加密一個遞增的計數器值,再將輸出與明文 XOR。這使 AES-CTR 實際上變成串流加密:
- 不需要 Padding
- 加密和解密完全相同的操作(對稱 XOR)
- 可完全並行處理
- 同樣不提供完整性驗證
4.4 GCM(伽羅瓦計數器模式)— 現代首選
GCM = CTR 加密 + GHASH 認證碼。它在提供加密的同時,自動生成一個 Authentication Tag(認證標籤),用於驗證密文未被篡改。
- 認證加密(AEAD):同時保證機密性和完整性
- 不需要 Padding,效能佳
- 支援 AAD(附加認證資料):可對不加密的 metadata 提供完整性保護
- 現代 TLS 1.3 主要使用 AES-256-GCM
| 模式 | 需要 Padding | 完整性驗證 | 可並行 | 推薦程度 |
|---|---|---|---|---|
| ECB | 是 | 否 | 是 | ❌ 絕對不用 |
| CBC | 是 | 否 | 部分 | ⚠️ 舊系統相容 |
| CTR | 否 | 否 | 是 | ✅ 可用(需另加 MAC) |
| GCM | 否 | ✅ 內建 | 是 | ✅✅ 現代首選 |
5. IV 和 Nonce:千萬不能重用
CBC 需要 IV,GCM 需要 Nonce(一次性隨機數)。這是 AES 使用中最容易犯錯的地方:
- 每次加密都必須使用不同的 IV/Nonce——重用會嚴重削弱安全性
- IV/Nonce 不需要保密,可以與密文一起明文傳輸
- GCM 的 Nonce 通常為 96 位元(12 位元組),使用密碼學安全的隨機數產生器生成
- GCM Nonce 重用是災難性的:攻擊者可以恢復認證金鑰,完全破解整個加密方案
永遠使用隨機生成的 IV/Nonce,永遠不要硬編碼或複用。使用密碼學安全的隨機數產生器(如 PHP 的
random_bytes()、Python 的 os.urandom())。
6. 金鑰派生:不要直接用密碼當金鑰
AES 金鑰必須是高熵的隨機位元組序列。如果系統以使用者設定的密碼作為加密來源,絕對不能直接使用密碼(或其 MD5/SHA 雜湊)作為 AES 金鑰。應使用 KDF(金鑰派生函數):
- PBKDF2:廣泛支援,可設定迭代次數,建議 600,000 次以上(OWASP 2023)
- Argon2:現代首選,同時對抗 GPU 和記憶體並行攻擊
- scrypt:記憶體硬化 KDF,廣泛用於加密貨幣錢包
7. 實戰程式碼範例
# PHP(使用 OpenSSL,AES-256-GCM)
$key = random_bytes(32); // 256 位元金鑰
$nonce = random_bytes(12); // 96 位元 Nonce
$ciphertext = openssl_encrypt(
$plaintext, 'aes-256-gcm', $key,
OPENSSL_RAW_DATA, $nonce, $tag
);
// 傳輸:nonce + tag + ciphertext(均為原始位元組)
// 解密
$decrypted = openssl_decrypt(
$ciphertext, 'aes-256-gcm', $key,
OPENSSL_RAW_DATA, $nonce, $tag
);
# Python(使用 cryptography 套件,AES-256-GCM)
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import os
key = os.urandom(32) # 256 位元金鑰
nonce = os.urandom(12) # 96 位元 Nonce
aesgcm = AESGCM(key)
ciphertext = aesgcm.encrypt(nonce, plaintext, None)
plaintext = aesgcm.decrypt(nonce, ciphertext, None)
# Node.js(內建 crypto 模組,AES-256-GCM)
const crypto = require('crypto')
const key = crypto.randomBytes(32)
const nonce = crypto.randomBytes(12)
const cipher = crypto.createCipheriv('aes-256-gcm', key, nonce)
const encrypted = Buffer.concat([cipher.update(plaintext), cipher.final()])
const tag = cipher.getAuthTag() // 16 位元組認證標籤
8. 常見問題
8.1 AES 被破解了嗎?
目前沒有任何實際可行的 AES 攻擊。最好的已知理論攻擊是 2011 年的 biclique 攻擊,將 AES-128 的暴力搜尋空間縮小了 4 倍——但仍需要 2¹²⁶·¹ 次操作,在可預見的未來完全不可行。AES 的安全性主要取決於金鑰管理和加密模式的正確使用,而非演算法本身。
8.2 AES-128 和 AES-256 哪個更好?
AES-128 對絕大多數應用已足夠安全。選擇 AES-256 的主要理由是:符合特定法規(如美國政府 FIPS 要求)、對量子電腦的防禦(量子電腦可將對稱加密的有效安全性折半,256 位元降為 128 位元仍安全),或心理安全感。AES-256 的效能代價約 40%,通常可忽略。
8.3 為什麼 HTTPS 還需要非對稱加密?
AES 是對稱加密,雙方必須共享同一把金鑰。但在陌生的網路上,如何安全地把金鑰傳給對方?這正是 RSA 或 ECDH 的作用:透過非對稱密碼學安全交換一個臨時的 AES 會話金鑰,之後的資料傳輸全部用 AES 加密。這種組合兼具非對稱加密的安全金鑰交換和對稱加密的高效能。
8.4 加密就夠了嗎?
不夠。加密只保護機密性,但不防止攻擊者篡改密文。這就是為什麼現代加密應使用 AEAD(認證加密),如 AES-GCM——它同時提供加密和完整性驗證。僅使用 AES-CBC 而不加 HMAC 的系統容易受到 Padding Oracle 等攻擊。
8.5 量子電腦會讓 AES 失效嗎?
Grover 演算法讓量子電腦能以 2^(n/2) 次操作找到 n 位元金鑰,相當於將 AES-256 的有效安全性降至 128 位元。因此 AES-256 被認為是後量子安全的對稱加密方案,而 AES-128 在量子威脅下可能不足。這也是為什麼 NIST 建議機密資料使用 AES-256。
9. 小結
AES 是現代密碼學的基石:經過二十多年的公開審查,至今仍牢不可破。但演算法本身只是一部分——正確使用才是關鍵:使用 GCM 模式(而非 ECB 或裸 CBC)、每次加密使用隨機 Nonce、以 KDF 派生金鑰而非直接使用密碼。掌握這些原則,AES 能為你的應用提供工業級的加密保護。