圖解AES密鑰擴展與加密過程
在嵌入式軟件開發中,特別是涉及到與云端進行數據傳輸時,為確保數據的安全性,需要對數據進行加密,本篇了就來介紹常用的一種加密方式——AES加密的原理。
1 AES加密簡介
AES(Advanced Encryption Standard,高級加密標準)是一種廣泛使用的對稱加密算法,由美國國家標準與技術研究院(NIST)于 2001 年標準化,用于替代安全性不足的 DES 算法。
AES 的核心特性
- 對稱加密:加密和解密使用相同的密鑰,密鑰長度可選擇 128 位、192 位或 256 位(分別稱為 AES-128、AES-192、AES-256),密鑰越長,安全性越高,但計算開銷也略大
- 分組加密:處理固定長度的明文塊(128 位,即 16 字節),若明文長度不足 16 字節,需通過填充(如 PKCS#7)補足;若超過 16 字節,則分塊處理并結合模式(如 CBC、GCM 等)保證安全性
- AES 的加密過程是對 16 字節明文塊(按 4×4 矩陣排列,稱為 “狀態矩陣”)進行多輪變換,輪數取決于密鑰長度:
AES-128:10 輪
AES-192:12 輪
AES-256:14 輪
本篇介紹最基礎的128 位密鑰,10輪加密,并且明文長度為16 字節不需要填充的情況。
例如:“coder-love-study”字符串剛好16個字符,只需要對這一個數據塊進行加密即可。
圖片
在執行加密前,需要先將字符串轉為對應的16進制數,也就是通過ASCII碼表進行轉換。
另外,需要注意是的,16個字節的數據塊,要按列優先的順序,排列到4x4的矩陣中,如下圖:
圖片
這里再附一份ASCII碼對照表:
圖片

AES-128的密鑰,剛好也是4x4的矩形(種子密鑰),而進行10輪加密,使用的密鑰是不同的,這些密鑰都是從種子密鑰擴展出來的。
下面就開始介紹AES的密鑰擴展和具體加密過程
2 輪密鑰的計算
AES 的原始密鑰(種子密鑰)通過特定算法擴展為多輪子密鑰(如 AES-128 需擴展為 11 個子密鑰,包含初始密鑰和 10 輪密鑰)。
擴展過程是按列進行擴展,其計算過程主要分為兩大類:
- 列索引是4的倍數:計算過程稍復雜
- 列索引不是4的倍數:計算過程稍簡單
圖片
2.1 S-Box表與輪常量表
在介紹密鑰擴展的具體步驟之前,先了解一下要用到的一些表
2.1.1 S-box表
是一個固定的表格,16行x16列,用于數據映射,后面字節代換時會用到
圖片
2.1.2 輪常量表
也是一個固定的表格,一共有10列,后面計算4的倍數列的密鑰時會用到,10個擴展密鑰分別會使用對應的列。
圖片
2.2 計算4的倍數列
先來介紹4的倍數列的擴展密鑰如何結算,例如第4列(輪密鑰1的最左側的列),計算過程為:
- 通過i-1列(第3列)進行數據變換,包括:
字節旋轉:就是把第3列的數據先取出來,然后循環移動1位
S-box查表:每個數據,看作是行、列左邊,去S-box中找到對應的位置,取出其存儲的值,作為替換值
與輪常量進行異或運算
- i-4列的值(第0列)與i-1列變換后的值,進行異或運算
圖片
如上圖的計算過程,最終計算得到第4列的密鑰為:9C A5 3F AA
S-box的映射過程舉例:
圖片
異或的計算過程:
圖片
2.3 計算非4的倍數列
再來看不是4的倍數列的擴展密鑰如何結算,例如第5列(輪密鑰2的第2列),計算過程為:
- i-4列的值(第1列)與i-1(第4列),進行異或運算即可
圖片
2.4 最終結果
按照上述方式,通過種子密鑰,依次計算出擴展密鑰的第4~43列,也就得到了輪密鑰1~輪密鑰10,后面在多輪加密時,會分別用到對應輪的密鑰。
圖片
3 加密過程解析
AES-128有10輪加密,其過程可以歸類為:
- 初始變換
執行輪密鑰加(種子密鑰加)
- 9輪循環運算,每一輪的步驟相同,密鑰不同
字節代換
行移位
列混淆
輪密鑰加
- 1輪最終輪
字節代換
行移位
輪密鑰加
圖片
3.1 初始變換
初始變換其實就是執行輪密鑰加,準確的說是種子密鑰加,因為初始變換使用的是種子密鑰。
具體的變換過程,就是數據矩陣和種子密鑰矩陣的對應位置的數據進行異或操作。

初始變換舉例:
圖片
3.2 9輪循環運算
9輪循環中,每輪循環依次執行如下步驟:
- 字節代換
- 行移位
- 列混淆
- 輪密鑰加(依次使用密鑰是前面計算出的輪密鑰1~輪密鑰9)
3.2.1 字節代換與行移位
字節代換,其實就是S-box表映射,前面在計算擴展密鑰時就使用過,這里就是要對4x4矩陣中的每一個數據都進行S-box的映射替換。
行移位,其過程可理解為:
- 第1行數據不動
- 第2行左移1位,然后左邊多出的1位數據再移動到右邊
- 第3行左移2位,然后左邊多出的2位數據再移動到右邊
- 第4行左移3位,然后左邊多出的3位數據再移動到右邊
具體過程可參考下圖:
圖片
3.2.2 列混淆
列混淆,是對4x4的數據再左乘一個列混淆的固定矩形。
列混淆的過程,和矩陣乘積運算是類似的,都是行列的數據先相乘再相加,不同點是:
- 相乘的運算,是有限域(2的8次方內)的相乘
- 相加的運算,替換為二進制的異或運算
圖片
有限域的相乘運算的具體過程如下:
- 先轉換為2進制進行計算
- AES的列混淆,與加密數據相乘的數據只有1、2、3這3種情況
與1相乘,不變
與2相乘,如果數據最高位是0,乘2就是左移一位,仍在有限域內;如果最高位是1,左移1位后會溢出,需要再與0x1B(AES中規定的不可約多項式的16進制表示)異或
與3相乘,先將3拆為1與2的異或,最終轉換為先與2相乘,再與自身異或
圖片
示例,這里對矩陣的第1行第1列,和第4行第2列進行手動計算,分別得到了AF和AB
圖片
3.2.3 輪密鑰加
在前面的初始變換中已解釋過了輪密鑰加,區別是:
- 初始變換中,使用的種子密鑰
- 9輪循環中,使用的對應輪的輪密鑰
輪密鑰加的過程,是數據矩陣和密鑰矩陣進行異或的過程
圖片
3.3 最終輪
最終輪中,執行如下步驟:
- 字節代換
- 行移位
- 輪密鑰加(使用輪密鑰10)
注意最終輪和前面9輪的區別是,沒有了列混淆的步驟。
圖片
因此,“coder-love-study”數據,使用自定義的密鑰,進行AES的10輪加密后,最終加密的就是上圖的結果。
4 總結
本篇介紹了AES加密的原理,通過一個具體的字符串和自定義密鑰,演示了AES加密的全過程,包括密鑰的擴展過程,每輪加密的數據變換過程等,最終得到加密的結果。
























