AES(Advanced Encryption Standard) 高級(jí)加密標(biāo)準(zhǔn),是 DES(Data Encryption Standard) 之后的一種對(duì)稱分組加密方式(關(guān)于對(duì)稱加密和非對(duì)稱加密可以參考我之前寫(xiě)的一篇文章 HTTPS從原理到應(yīng)用(一):加密(Encrypt)與哈希(Hash) )。DES 的密鑰長(zhǎng)度為 56bits, AES 主要是為了解決 DES 密鑰太短以致于不能提供足夠安全的問(wèn)題。 AES 是美國(guó)國(guó)家標(biāo)準(zhǔn)技術(shù)研究所 (National Institute of Standards and Technology: NIST) 面向世界征集的一個(gè)算法,從最終獲勝的 Rijndael 算法改進(jìn)而來(lái)的, Rijndael 算法是一個(gè)分組密碼算法族,其分組長(zhǎng)度包括 128bits 160bits 192bits 224bits 256bits ,密鑰長(zhǎng)度也包括這五種長(zhǎng)度;但是最終 AES 只選取了分組長(zhǎng)度為 128bits ,密鑰長(zhǎng)度為 128bits 192bits 256bits 的三個(gè)版本。下面以密鑰長(zhǎng)度為 128bits 為例進(jìn)行講解。
算法步驟
先看下圖,根據(jù)圖來(lái)講解,比較好理解:

從上圖可知加密過(guò)程需要的運(yùn)算有 SubBytes ShiftRows MixColumns AddRoundKey Key Schedule。首先明文 128位(16字節(jié)),分成一個(gè) 4 x 4 的矩陣(列優(yōu)先排序),先做一次 AddRoundKey 運(yùn)算,然后重復(fù)9次,SubBytes ShiftRows MixColumns AddRoundKey 運(yùn)算這9次過(guò)后,在重復(fù)一次但是最后這一次沒(méi)有 MixColumns 步驟,上述中的每一次 AddRoundKey,都需要密鑰,除了第一次是初始密鑰,后面的密鑰都是根據(jù)初始密鑰經(jīng)過(guò) KeySchedule 變換而來(lái)。AES的解密過(guò)程為加密過(guò)程的逆運(yùn)算,就沒(méi)有畫(huà)圖。下面分別具體來(lái)講 SubBytes ShiftRows MixColumns AddRoundKey Key Schedule。
SubBytes
矩陣中的各字節(jié)通過(guò)一個(gè) 8 位的 S-box 進(jìn)行轉(zhuǎn)換,用于提供算法的混淆性。。關(guān)于 S-box 的構(gòu)造這里不做敘述,S-box 以及 S-box的逆 如下圖:


舉例:字節(jié) 00000000,高四位的值對(duì)應(yīng) x 軸,低四位的值對(duì)應(yīng) y 軸,對(duì)應(yīng)S-box表可知,字節(jié)00000000 SubBytes 后轉(zhuǎn)換為字節(jié)0x63。在根據(jù)逆S-box表,字節(jié) 0x63 SubBytes 后轉(zhuǎn)換為字節(jié)0x00。
ShiftRows
行移位是一個(gè) 4 x 4 的矩陣內(nèi)部字節(jié)之間的置換,用于提供算法的擴(kuò)散性。正向行移位,第一行不變,第二行向左移動(dòng) 8bit 位,第三行向左移動(dòng)16bit 位,第四行向左移動(dòng) 24bit 位。反向行移位,第一行不變,第二行向右移動(dòng) 8bit 位,第三行向右移動(dòng) 16bit 位,第四行向右移動(dòng) 24bit 位。

MixColumns
每一列的四個(gè)字節(jié)通過(guò)線性變換互相結(jié)合,用于提供算法的擴(kuò)散性。具體運(yùn)算看下圖。



由矩陣的乘法運(yùn)算可知,運(yùn)算后矩陣中的每個(gè)字節(jié)只與該列的 4 個(gè)值有關(guān),所以這個(gè)操作列混淆。另外此處的乘法和加法都是定義在 有限域GF(2^8)上的多項(xiàng)式模運(yùn)算 。 圖1-5 為 逆向MixColumns運(yùn)算 , 圖1-6 表示正向和逆向所用的矩陣互逆,這樣才可以進(jìn)行解密運(yùn)算。這一塊要稍微有一點(diǎn)數(shù)學(xué)基礎(chǔ)才能理解,要知道線性代數(shù)中的 矩陣運(yùn)算 和 有限域GF(2^8)上的多項(xiàng)式模運(yùn)算 。關(guān)于這兩點(diǎn)我不過(guò)多描述,感覺(jué)興趣的同學(xué)可以下去查資料或者跟我私下交流溝通。
AddRoundKey
這個(gè)步驟比較簡(jiǎn)單,矩陣中的每一個(gè)字節(jié)都與該次輪秘鑰(round key)做異或運(yùn)算。

Key Schedule
AddRoundKey 這個(gè)步驟,除第一次是使用原始密鑰,后續(xù)的步驟都是通過(guò)對(duì)原始密鑰進(jìn)行密鑰擴(kuò)展而來(lái)的。具體擴(kuò)展步驟如下圖所示:

將原始密鑰以字節(jié)按上圖 K0 K1 ... K15 的順序排列,也是第一次做
AddRoundKey 運(yùn)算時(shí)用到的矩陣。第二次做 AddRoundKey 運(yùn)算時(shí),已經(jīng)是密鑰擴(kuò)展之后的密鑰了。擴(kuò)展步驟為上圖所示, K41 列通過(guò) K0 列和
K12 列做一次 ShiftColumns 然后在做一次 SubBytes 和最下面矩陣的 第一列 做異或運(yùn)算,求出 K41 列;然后 K51 列為 K4 列與 K41 列異或,
K61 列為 K8 列與 K51 列異或, K71 列為 K12 列與 K61 列異或。這樣就求出了第二次 AddRoundKey 運(yùn)算所用到的矩陣。第三次,同樣按這個(gè)步驟,有兩點(diǎn)需要注意:
- 原始矩陣為第二次
AddRoundKey運(yùn)算用到的K41這個(gè)矩陣, - 計(jì)算矩陣第一列值的時(shí)候,要使用下面矩陣的第二列,即
02那一列。
下面矩陣有 10 列,以此可求出 10 個(gè)矩陣,分別對(duì)應(yīng)除第一次使用原始密鑰的后面 10 次 AddRoundKey 運(yùn)算。
總結(jié)
AES 是一種對(duì)稱分組密碼,對(duì)稱密碼我已經(jīng)講解過(guò),分組密碼是將一個(gè)明文分組作為整體加密并且通常得到的是與明文等長(zhǎng)的密文分組。分組密碼,有不同的工作模式,主要是為了增強(qiáng)密碼算法,或者使算法適應(yīng)具體應(yīng)用的技術(shù)。工作模式有電碼本模式(ECB),密文分組鏈接模式(CBC),密文反饋模式(CFB),輸出反饋模式(OFB),計(jì)數(shù)器模式(CTR)。此篇文章,主要講述 AES加密 的步驟,這些工作模式,以及 SubBytes 中 S-box 的構(gòu)造,和 有限域GF(2^8)上的多項(xiàng)式模運(yùn)算 都沒(méi)有做過(guò)多的講解;另外這兒也沒(méi)有給出實(shí)現(xiàn)的代碼,這個(gè)后續(xù)會(huì)補(bǔ)上。若有疑問(wèn)歡迎探討,若是對(duì)我沒(méi)有提到的幾個(gè)點(diǎn)有興趣,可以查相關(guān)資料去了解,也可以和我探討。這是一系列文章的其中一篇,你可以在這兒Encode & Decode集序找到他其他的兄弟。
參考
- 密碼算法詳解——AES
- AES加密算法圖解
- William Stallings著. 王張宜,楊敏,杜瑞穎,等譯. 密碼編碼學(xué)與網(wǎng)絡(luò)安全 —— 原理與實(shí)踐(第五版)[M]. 北京:電子工業(yè)出版社,2012.1.