AES 加密解密工具
專業級 AES 對稱加密,支援 6 種加密模式和 5 種填充方式
加密配置
什麼是 AES 加密?
AES(Advanced Encryption Standard,進階加密標準)是目前全球最廣泛使用的對稱加密演算法,被美國國家安全局(NSA)批准用於保護絕密級資訊。AES 由比利時密碼學家 Joan Daemen 和 Vincent Rijmen 設計的 Rijndael 演算法演變而來,於 2001 年由美國國家標準與技術研究院(NIST)正式發布,用於替代已經不再安全的 DES 演算法。 AES 採用分組加密方式,每組固定 128 位元(16 位元組),支援 128、192 和 256 位元三種金鑰長度,分別對應 AES-128、AES-192 和 AES-256 三個安全級別。金鑰越長,安全性越高,但加解密速度會略有下降。作為對稱加密演算法,AES 使用相同的金鑰進行加密和解密,這使得它在效能上遠優於非對稱加密演算法。 AES 的應用場景非常廣泛:在網路安全領域,TLS/SSL 協定使用 AES 保護網頁瀏覽和電子郵件傳輸;在儲存安全領域,BitLocker、FileVault 等磁碟加密工具採用 AES 加密使用者資料;在資料庫安全領域,許多資料庫系統支援 AES 欄位級加密;在物聯網領域,AES 也被廣泛用於裝置間的安全通訊。本工具支援 AES 的全部 6 種加密模式(ECB、CBC、CFB、OFB、CTR、GCM)和 5 種填充方式,滿足各種加密需求。
使用方法
使用方法
- 選擇加密模式(建議使用 GCM 以同時驗證加密與完整性)
- 選擇填充方案(GCM/CFB/OFB/CTR 模式自動不使用填充)
- 選擇金鑰長度(256 位元安全性最高,128 位元效能最佳)
- 輸入金鑰或點選「產生隨機金鑰」自動產生一組
- 對於需要 IV 的模式,請輸入或產生一組初始向量
- 在左側面板輸入明文(加密)或密文(解密)
- 結果會自動顯示在右側面板
- 點選「複製」複製結果,或點選「交換」互換輸入與輸出
加密模式
- GCM — Galois/Counter Mode,建議使用。提供加密與驗證功能,無需填充,支援平行處理,適用於網路傳輸及 TLS
- CBC — Cipher Block Chaining,經典模式。加密前將每個明文區塊與前一個密文區塊進行 XOR 運算,需要填充及 IV,安全性佳但不支援平行處理
- CFB — Cipher Feedback,串流加密模式。將區塊加密轉換為串流加密,無需填充,適用於串流資料,支援即時加密
- OFB — Output Feedback,類似 CFB 但錯誤不會擴散,適用於有雜訊的通道,無需填充
- CTR — Counter 模式。使用遞增計數器產生金鑰串流,無需填充,支援完整平行加密,效能優異
- ECB — Electronic Codebook,不建議使用。相同明文會產生相同密文,會洩漏資料模式,僅適用於加密單一資料區塊
填充方案
- PKCS7 — PKCS#7 填充,最常用且建議使用。自動以 N 個值為 N 的位元組填充,解密時可準確還原,不會產生歧義
- ZeroPadding — 零值填充。以 0x00 位元組填充,方式簡單,但當資料本身以零位元組結尾時可能產生歧義
- NoPadding — 不填充。要求資料長度必須為 16 位元組的整數倍,適用於串流模式或已知長度的資料
- ISO7859 — ISO/IEC 7816-4 填充。第一個填充位元組為 0x80,後續補上 0x00 位元組,廣泛應用於智慧卡及金融業
- ANSIX923 — ANSI X.923 填充。填充位元組皆為 0x00,最後一個位元組表示填充長度,常用於金融資料交換
使用提示
- 金鑰應使用密碼學安全的隨機數產生,避免使用可猜測的字串
- 每次加密應使用不同的隨機 IV,切勿重複使用
- GCM 模式建議使用 12 位元組(96 位元)的 IV,以獲得最佳效能與安全性
- CTR 與 GCM 模式支援平行處理,可加速大量資料的加密
- 金鑰與 IV 可輸入十六進位、純文字或 Base64 格式
- 十六進位金鑰長度:128 位元 = 32 字元,192 位元 = 48 字元,256 位元 = 64 字元
使用場景
技術原理
AES(進階加密標準)於 2001 年 11 月由 NIST 以 FIPS 197 發布,經過 1997 年開始的五年公開競選,共有 15 個候選演算法。最終由比利時密碼學家 Joan Daemen 和 Vincent Rijmen 設計的 Rijndael 勝出,擊敗了 Twofish、Serpent、RC6 和 Mars 等決賽入圍者。AES 取代了 DES(FIPS 46,已於 2005 年撤銷),現在是全球部署最廣泛的對稱區塊加密演算法:它存在於 TLS 1.2/1.3、IPsec、BitLocker、FileVault、OpenSSL 的預設 `aes-256-gcm`、Linux 核心的 dm-crypt、Apple 的 CryptoKit 以及 Android 的 Keystore 中。NSA 於 2003 年批准 AES-256 用於最高機密(TOP SECRET)保護(Suite A),使 AES 成為首個被允許用於美國最高機密等級的公開加密演算法。區塊大小固定為 128 位元(16 位元組);金鑰長度為 128、192 或 256 位元,分別對應 10、12 或 14 輪運算。 每一輪(最後一輪除外)對 4x4 位元組狀態執行四個操作:SubBytes 套用固定的 16x16 S-Box(0x63 = 01100011 位於第 6 行第 3 列——S-Box 的構造方式為 GF(2^8) 中的乘法反元素加上仿射變換,以破壞代數結構);ShiftRows 將第 0 行旋轉 0 位元組、第 1 行旋轉 1 位元組、第 2 行旋轉 2 位元組、第 3 行旋轉 3 位元組;MixColumns 在 GF(2^8) 上將每欄乘以固定的循環 MDS 矩陣(矩陣形式的多項式 0x03 * x);AddRoundKey 與輪金鑰進行 XOR 運算。最後一輪省略 MixColumns。輪金鑰來自 Rijndael 金鑰排程:共 11/13/15 個 128 位元的輪金鑰,透過 RotWord(向左旋轉 1 位元組)、SubWord(套用 S-Box)和與 Rcon[i] = [0x01, 0x02, 0x04, ..., 0x80, 0x1b, 0x36] *2^(i-1) 在 GF(2^8) 上的 XOR 產生。本頁面的 `aes-js` 函式庫以純 JavaScript 執行全部四個步驟,且與 OpenSSL 的 libcrypto 位元組相容。 頁面提供五種區塊加密模式。ECB 獨立加密每個 16 位元組區塊:相同的明文區塊會產生相同的密文區塊,從而洩漏結構(著名的 ECB 企鵝影像在加密後仍保留輪廓,因為像素模式在加密後依然存在)。CBC 在加密前將每個明文區塊與前一個密文區塊進行 XOR 運算;第一個區塊與 IV 進行 XOR。CTR 透過加密遞增計數器(nonce || counter,兩者各為 128 位元區塊的 64 位元半部)並將金鑰串流與明文進行 XOR,將 AES 轉變為串流加密——支援隨機存取和平行加密。GCM 是 CTR 加上 GHASH(GF(2^128) 上的通用雜湊認證器),產生 16 位元組的認證標籤附加在密文之後。GCM 是 TLS 1.3(RFC 8446)和大多數現代 API(Node 的 `crypto.createCipheriv('aes-256-gcm', ...)`)的預設 AEAD。CFB 和 OFB 是較舊的串流加密模式,保留以維持相容性。 IV 使用陷阱是最常見的生產環境錯誤。GCM 搭配 96 位元(12 位元組)IV 是 NIST 推薦的配置(RFC 5288、NIST SP 800-38D §5.2.1.1):12 位元組 IV 被視為計數器,GHASH 在 J0 = IV || 0x00000001 上計算。在 CTR 模式下重複使用 IV 會洩漏明文 XOR(C1 XOR C2 = P1 XOR P2——單次選擇明文攻擊即可還原兩則訊息)。在 GCM 下重複使用 IV 更為嚴重:攻擊者可以還原認證子金鑰 H,並為任意訊息偽造標籤(此攻擊出自 Joux 2006,也是 NIST 禁止在未嚴格保證唯一性的情況下使用隨機 96 位元 IV 的原因)。本頁面使用 `crypto.getRandomValues(new Uint8Array(12))` 為 GCM 產生 12 位元組 IV,為 CBC/CFB/OFB 產生 16 位元組 IV,隨機金鑰按鈕使用相同的 CSPRNG,確保每次加密都使用全新的材料。 本工具完全在瀏覽器中使用 aes-js(純 JavaScript AES 實作)完成加解密。不存在 Web Crypto / SubtleCrypto 回退路徑——無論負載大小,所有運算都透過 aes-js。
- AES 是 FIPS 197(2001),透過 NIST 公開競選從 15 個候選演算法中選出;Rijndael 擊敗了 Twofish、Serpent、RC6 和 Mars。區塊大小固定為 128 位元;金鑰長度 128/192/256 位元分別執行 10/12/14 輪。本頁面透過 aes-js 的 AES_128、AES_192 和 AES_256 建構函式支援全部三種。
- 四步輪函數:SubBytes(256 位元組 S-Box,為 GF(2^8) 反元素加上仿射變換)、ShiftRows(各列移位 0/1/2/3 位元組)、MixColumns(GF(2^8) 上使用 0x03 多項式的 MDS 矩陣乘法)、AddRoundKey(與輪金鑰 XOR)。最後一輪省略 MixColumns。相同演算法、相同金鑰 = 相同密文——AES 是確定性的。
- ECB 不安全,因為相同的明文區塊會產生相同的密文區塊(著名的「ECB 企鵝」影像保留了輪廓)。CBC 是安全的經典模式;CTR 增加了平行性;GCM 增加了認證功能,是 TLS 1.3 的預設模式(RFC 8446)。CFB 和 OFB 是為了向後相容而保留的串流加密模式。
- PKCS#7 填充:差 1 位元組 → 15 個 0x0f 位元組 + 1 個 0x10 位元組;差 2 位元組 → 14 個 0x0e 位元組 + 2 個 0x0f 位元組,依此類推。最後一個位元組的值就是填充長度,因此去填充是明確的。串流模式(CTR/CFB/OFB/GCM)完全跳過填充。ZeroPadding 在資料以 0x00 結尾時會產生歧義——不要使用。
- GCM 是 AEAD:密文加上 16 位元組認證標籤,透過 GF(2^128) 上的 GHASH 計算,使用 H = AES_K(0^128)。AAD(額外認證資料)涵蓋標頭但不對其加密。96 位元 IV(RFC 5288)被視為計數器;128 位元 IV 會經過 GHASH 推導 J0——安全性相同,速度稍慢。
- IV 重複使用是災難性的。CTR IV 重複使用會洩漏 P1 XOR P2(二次填充)。GCM IV 重複使用(Joux 2006)允許攻擊者還原 H 並偽造標籤。本頁面使用 `crypto.getRandomValues`(CSPRNG)產生 IV,在一個工作階段內絕不重複使用,並將 IV 前置於密文中,讓解密端無需帶外狀態即可取回。
- AES 金鑰產生:本工具的「產生隨機金鑰」按鈕使用瀏覽器提供的 `crypto.getRandomValues`(CSPRNG)。AES 輪函數計算透過 aes-js(純 JavaScript 實作)完成,在相同金鑰、IV、填充設定下與 OpenSSL libcrypto 位元組級一致。
- 旁通道現實:純 JS 的 AES 不是常數時間的(索引 S-Box 陣列會洩漏時序)。Web Crypto 的 AES 以原生程式碼執行且為常數時間。對於高安全性工作負載(HSM、伺服器端 KDF)應優先使用原生路徑;對於瀏覽器內學習工具,aes-js 就足夠了,因為輸入已經在頁面記憶體中。遷移路徑:雜湊演算法從 SHA-1 遷移到 SHA-256,加密演算法從 DES 遷移到 AES,加密模式從 ECB 遷移到 GCM。
範例
AES-128-CBC 加密
明文: Hello, World!
金鑰: 0123456789abcdef0123456789abcdef (32 hex = 128 bit)
IV: fedcba9876543210fedcba9876543210 (32 hex = 128 bit)
模式: CBC / PKCS#7 / 128-bit
頁面會在輸出面板產生密文(Base64 與 Hex)。點選「複製」可
取得該值,或點選「交換」反向解密。PKCS#7 填充會附加 3 個位元組
(0x03 0x03 0x03),讓填充後的明文剛好填滿一個 AES 區塊。
FIPS: FIPS 197 定義 AES;NIST SP 800-38A 定義 CBC 模式AES-256-GCM 認證加密
明文: sensitive data payload
金鑰: 6f8a3b2c1d9e7f5a4b8c0d2e1f3a5b7c9d1e3f5a7b9c1d3e5f7a9b1c3d5e7f9a (64 hex = 256 bit)
IV: 1a2b3c4d5e6f708192a3b4c5 (24 hex = 12 bytes,GCM 建議長度)
模式: GCM / NoPadding / 256-bit / AAD 為空
輸出格式: IV (12B) || 密文 || AuthTag (16B)
FIPS: NIST SP 800-38D 定義 GCM 模式;96-bit 的 IV 會被當成計數器使用AES-128-ECB(FIPS 197 附錄 B 測試向量)
金鑰: 2b7e151628aed2a6abf7158809cf4f3c (128 bit)
明文: 3243f6a8885a308d313198a2e0370734
密文 (Hex): 3925841d02dc09fbdc118597196a0b32
模式: ECB / 128-bit
注意: ECB 對每個 16 位元組的區塊獨立加密。相同的明文區塊
永遠會產生相同的密文區塊。
FIPS: FIPS 197 附錄 B 提供此標準測試向量AES 各模式的安全性比較
ECB: 無 IV,具確定性,會洩漏資料樣式 - 千萬不要在正式環境使用
CBC: 隨機 IV,僅解密可平行化,需要 HMAC 確保完整性
CTR: 計數器 IV,加解密皆可平行化,需要 MAC
GCM: 隨機 IV,可平行化,內建認證標籤
新系統建議優先採用 AES-256-GCM:
- 256-bit 金鑰可抵抗量子攻擊(Grover 演算法)
- GCM 在單一運算中同時提供機密性與完整性
- TLS 1.3 強制要求採用 AES-GCM 等 AEAD 加密法
NIST: NIST SP 800-38A/D 文件記載上述所有模式常見問題
AES 是什麼?支援哪些金鑰長度?
AES(進階加密標準,FIPS 197)是現代 HTTPS、Wi-Fi WPA2 與磁碟加密大量採用的對稱式密碼演算法。本頁支援 128、192、256 位元金鑰。AES-128 速度快、對絕大多數應用都足夠安全;只有在需要長期抵禦未來量子密碼分析時,才選擇 AES-256。
我該選哪一種模式?ECB、CBC、CFB、OFB、CTR 還是 GCM?
ECB 除了單一區塊測試向量以外都不安全(會洩漏資料的重複樣式)。CBC 與 CTR 只提供機密性,需要再搭配獨立的 MAC。GCM 是現代預設選擇——它同時加密並驗證密文,HTTPS 用的就是它。除非要與舊系統互通,否則直接選 GCM。
該使用哪種填充方式?
PKCS#7(也叫 PKCS#5)是 ECB 與 CBC 模式的標準填充。CTR、CFB、OFB、GCM 屬於串流式模式不需要填充——本頁在這些模式下會強制使用 NoPadding。如果解密時出現「bad padding」錯誤,最常見的原因是兩端的金鑰、IV 或填充設定不一致。
為什麼同一段文字每次加密出來的密文都不一樣?
ECB 以外的模式都會用到 IV(初始化向量),每次加密都應該使用隨機的 IV。相同的明文+相同的金鑰+不同的 IV → 不同的密文。IV 不需要保密,可以直接附在密文前面,但在 CTR 或 GCM 模式下用同一把金鑰重複使用 IV 會是災難性的,會直接擊潰整個加密。
AES 抗量子嗎?
在足夠規模的量子電腦上,Grover 演算法會把 AES-128 的有效安全強度降到約 64 位元;AES-256 則降到 128 位元。因此若資料需要保密數十年,AES-256 是較保守的選擇。對稱式的 AES 受量子衝擊遠小於 RSA/ECC。
加密是在我的瀏覽器裡完成的嗎?
是的。本頁使用 aes-js(純 JavaScript AES 實作)在瀏覽器本機執行加解密。明文、金鑰、IV 都不會離開你的裝置,可以從瀏覽器的 Network 分頁自行驗證。
我該如何安全地共用金鑰?
千萬不要把真正的正式金鑰貼到任何網頁,包括本工具。請把它當成學習輔助與測試向量驗證工具。真正的金鑰交換要使用非對稱演算法(RSA-OAEP、ECDH/X25519)、搭配鹽值的 PBKDF2/Argon2 密碼派生金鑰,或受託管的 KMS——絕對不要「在聊天室把金鑰傳過去」。