## AES 加密原理 AES(Advanced Encryption Standard,進階加密標準)是一種**對稱式加密演算法**,也就是說,**加密和解密都使用相同的金鑰**。根據金鑰長度不同,AES 提供 **128、192 或 256 位元**的安全性。以下是 AES 的核心概念與運作流程: ### 基本概念 1. **對稱式加密** - 加密和解密都使用**相同的金鑰**。 - 這種加密方式的安全性取決於金鑰是否保密。 2. **區塊加密** - AES 以**固定大小的區塊(128 位元 = 16 位元組)**進行加密。 - 如果輸入資料超過區塊大小,則會**補齊(Padding)**,或將資料分割成多個區塊分別加密。 3. **多輪加密** - AES 根據金鑰長度不同,會執行 **10、12 或 14 輪**的運算,每輪都包含多個步驟。 ### 加密流程 ![image](https://hackmd.io/_uploads/H1_12XzvJx.png) 每個區塊會依照以下步驟逐一加密,直到所有區塊加密完成後,再將它們組合成最終的密文: ## AES 加密流程 ### **1. 初始運算:AddRoundKey** - **AddRoundKey**:將**明文與第一組輪密鑰(Round Key)進行 XOR 運算**。 ![image](https://hackmd.io/_uploads/HyNYC7YUkx.png) ### **2. 重複運算(根據金鑰長度,執行 10、12 或 14 輪)** 每輪加密包含以下 **四個步驟**: #### **步驟 1:SubBytes** - **使用 S-Box(替換表)對狀態矩陣的每個字節進行替換**。 - S-Box 是透過**非線性轉換與有限域(GF)反演**計算出的,可增強 AES 對攻擊的抵抗力。 ![image](https://hackmd.io/_uploads/ByhIGEF8yx.png) #### **步驟 2:ShiftRows** - **狀態矩陣的每一列進行位移**,以打散明文的字節排列,提高擴散性: - **第 0 列**:不變。 - **第 1 列**:左移 1 位元組。 - **第 2 列**:左移 2 位元組。 - **第 3 列**:左移 3 位元組。 ![image](https://hackmd.io/_uploads/H1szQNFUyg.png) #### **步驟 3:MixColumns** - **每一欄的數據視為多項式,並與固定多項式相乘**,讓單一字節的變化影響整欄數據,增強擴散效果。 ![image](https://hackmd.io/_uploads/BkNifNYL1x.png) #### **步驟 4:AddRoundKey** - **將當前狀態矩陣與該輪對應的密鑰進行 XOR 運算**。 ![image](https://hackmd.io/_uploads/BkcCG4tUyg.png) ### **3. 最終輪運算(Final Round)** - **重複執行**「SubBytes、ShiftRows 和 AddRoundKey」**(省略 MixColumns)**。 - 最終輸出即為**密文**。 ## **AES 解密流程** ![image](https://hackmd.io/_uploads/Hk0ajXzvkg.png) AES 的解密過程是加密的反向操作,主要步驟如下: 1. **InvShiftRows** 2. **InvSubBytes** 3. **AddRoundKey** 4. **InvMixColumns** 與加密不同,**解密時的使用順序是反向的**。 ## **AES 兩種加密模式** 區塊加密(Block Cipher)是一種**固定區塊大小**的加密方式,每個明文區塊會對應到相同大小的密文區塊。**AES 的區塊大小固定為 128 位元**(16 位元組),但金鑰長度可以是 **128、192 或 256 位元**。 當明文長度不足 128 位元時,需要**補齊(Padding)**,常見的填充方式包括 **PKCS5 或 PKCS7**。 ### **1. ECB 模式(Electronic Code Book,電子密碼本模式)** ![image](https://hackmd.io/_uploads/rJn44EMD1l.png) **ECB 模式的特點**: - **每個明文區塊**都是**獨立加密**的,彼此之間沒有關聯。 - 這種模式的優勢是**可以並行處理**,加密速度快。 - **缺點**:相同的明文區塊會產生相同的密文區塊,導致安全性較低,容易被模式分析攻擊(Pattern Attack)破解。 - **適用場景**:僅適合小量、不敏感的數據加密。 ### **2. CBC 模式(Cipher Block Chaining,加密區塊鏈模式)** ![image](https://hackmd.io/_uploads/Sy8lEVfvke.png) **CBC 模式的特點**: - 每個**明文區塊**在加密前**都會與前一個密文區塊進行 XOR 運算**,因此**每個區塊的加密結果都不同**。 - 第一個區塊需要一個 **初始化向量(IV,Initialization Vector)** 來進行 XOR 運算,以確保每次加密輸出都不同,即使明文相同。 - **缺點**:由於每個區塊依賴於前一個區塊,無法並行加密,導致效能較低。 - **適用場景**:適合需要更高安全性的應用,例如**傳輸機密資料**或**檔案加密**。 **並行處理應用**: 儘管 CBC 模式無法針對單一任務並行加密,但可以**針對多個獨立任務並行運作**,提升硬體資源利用率。例如: - **不同用戶的 CBC 加密**可以獨立處理,提高整體系統效能。 ## 實驗結果 我在使用C語言實現AES加解密結果,完整的專案程式碼可以參考 [bujiyao/AES-implementation-c](https://github.com/bujiyao/AES-implementation-c)這個專案。這個實作完整涵蓋了 AES-128、AES-192 和 AES-256,並包含 加密、解密、密鑰擴展(Key Expansion)等核心功能。 單元測試結果如下: ```bash Running AES unit tests: [PASS] test_add_round_key [PASS] test_sub_bytes [PASS] test_shift_rows [PASS] test_inv_shift_rows [PASS] test_mix_columns [PASS] test_inv_mix_columns [PASS] test_aes_encrypt_decrypt All tests completed. ``` ## 參考資料 - [AES Encryption: Secure Data with Advanced Encryption Standard](https://www.simplilearn.com/tutorials/cryptography-tutorial/aes-encryption) - [The difference in five modes in the AES encryption algorithm](https://www.highgo.ca/2019/08/08/the-difference-in-five-modes-in-the-aes-encryption-algorithm/) - [A Pipelined AES and SM4 Hardware Implementation for Multi-Tasking Virtualized Environments](https://easychair.org/publications/preprint/BNHg)