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.