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

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

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















 
 
 






 
 
 
 