?xml version="1.0" encoding="UTF-8"?
美國國家標準技術(shù)研究所在 2001 年發(fā)布了高級加密標準(AES)坑质。AES 是一個對稱分組密碼算法搪缨,旨在取代 DES 成為廣泛使用的標準潜沦。
根據(jù)使用的密碼長度枉昏,AES 最常見的有 3 種方案,用以適應(yīng)不同的場景要求妄帘,分別是 AES-128楞黄、AES-192 和 AES-256。本文主要對 AES-128 進行介紹抡驼,另外兩種的思路基本一樣鬼廓,只是輪數(shù)會適當增加。
1 算法流程
AES 加解密的流程圖如下:
AES 加密過程涉及到 4 種操作:字節(jié)替代(SubBytes)致盟、行移位(ShiftRows)碎税、列混淆(MixColumns)和輪密鑰加(AddRoundKey)。
解密過程分別為對應(yīng)的逆操作馏锡。由于每一步操作都是可逆的雷蹂,按照相反的順序進行解密即可恢復明文。
加解密中每輪的密鑰分別由初始密鑰擴展得到杯道。算法中 16 字節(jié)的明文匪煌、密文和輪密鑰都以一個 4x4 的矩陣表示。
接下來分別對上述 5 種操作進行介紹党巾。
1.1 字節(jié)替代
字節(jié)代替的主要功能是通過 S 盒完成一個字節(jié)到另外一個字節(jié)的映射萎庭。S 盒的詳細構(gòu)造方法可以參考文獻[1]。
下圖(a)為 S 盒齿拂,圖(b)為 S-1(S盒的逆)驳规。
S 和 S-1?分別為 16x16 的矩陣。假設(shè)輸入字節(jié)的值為 a=a7a6a5a4a3a2a1a0署海,則輸出值為 S[a7a6a5a4][a3a2a1a0]达舒,S-1?的變換也同理。
例如:字節(jié) 00 替換后的值為(S[0][0]=)63叹侄,再通過 S-1?即可得到替換前的值巩搏,(S-1?[6][3]=)00。
1.2 行移位
行移位的功能是實現(xiàn)一個 4x4 矩陣內(nèi)部字節(jié)之間的置換趾代。
1.2.1 正向行移位
正向行移位的原理圖如下:
實際移位的操作即是:第一行保存不變贯底,第二行循環(huán)左移 1 個字節(jié),第三行循環(huán)左移 2 個字節(jié)撒强,第四行循環(huán)左移 3 個字節(jié)禽捆。
假設(shè)矩陣的名字為 state,用公式表示如下:
state’[i][j] = state[i][(j+i)%4]; 其中 i飘哨、j 屬于 [0,3]
1.2.2 逆向行移位
逆向行移位即是相反的操作胚想,用公式表示如下:
state’[i][j] = state[i][(4+j-i)%4]; 其中 i、j 屬于 [0,3]
1.3 列混淆
列混淆:利用 GF(28) 域上算術(shù)特性的一個代替芽隆。
1.3.1 正向列混淆
正向列混淆的原理圖如下:
根據(jù)矩陣的乘法可知啄栓,在列混淆的過程中,每個字節(jié)對應(yīng)的值只與該列的 4 個值有關(guān)系躏仇。此處的乘法和加法都是定義在 GF(28) 上的,需要注意如下幾點:
1)?將某個字節(jié)所對應(yīng)的值乘以 2愁憔,其結(jié)果就是將該值的二進制位左移一位,如果該值的最高位為 1(表示該數(shù)值不小于 128)孽拷,則還需要將移位后的結(jié)果異或 00011011吨掌;[1]
2)?乘法對加法滿足分配率,例如:07·S0,0=(01⊕02⊕04)·S0,0= S0,0⊕(02·S0,0)(04·S0,0)
3)?此處的矩陣乘法與一般意義上矩陣的乘法有所不同脓恕,各個值在相加時使用的是模 2 加法(相當于是異或運算)膜宋。
假設(shè)某一列的值如下圖,運算過程如下:
同理可以求出另外幾個值炼幔。
1.3.2 逆向列混淆
逆向列混淆的原理圖如下:
由于:
說明兩個矩陣互逆秋茫,經(jīng)過一次逆向列混淆后即可恢復原文。
1.4 輪密碼加
任何數(shù)和自身的異或結(jié)果為0江掩。加密過程中学辱,每輪的輸入與輪密鑰異或一次乘瓤;因此环形,解密時再異或上該輪的密鑰即可恢復輸入。
1.5 密鑰擴展
密鑰擴展的原理圖如下:
密鑰擴展過程說明:
1)??將初始密鑰以列為主衙傀,轉(zhuǎn)化為 4 個 32 bits 的字抬吟,分別記為 w[0…3];
2)??按照如下方式统抬,依次求解 w[j]火本,其中 j 是整數(shù)并且屬于 [4,43];
3)??若 j%4=0聪建,則 w[j]=w[j-4]⊕g(w[j-1])钙畔,否則 w[j]=w[j-4]⊕w[j-1];
函數(shù) g 的流程說明:
4)??將 w 循環(huán)左移一個字節(jié)金麸;
5)??分別對每個字節(jié)按 S 盒進行映射擎析;
6)??與 32 bits 的常量(RC[j/4],0,0,0)進行異或,RC 是一個一維數(shù)組挥下,其值如下揍魂。(RC 的值只需要有 10 個,而此處用了 11 個棚瘟,實際上 RC[0] 在運算中沒有用到现斋,增加 RC[0] 是為了便于程序中用數(shù)組表示。由于 j 的最小取值是 4偎蘸,j/4 的最小取值則是 1庄蹋,因此不會產(chǎn)生錯誤瞬内。)
RC = {00, 01, 02, 04, 08, 10, 20, 40, 80, 1B, 36}
2 源碼
在 GitHub 上找到的 AES 實現(xiàn)代碼,感覺寫得不錯蔓肯。
https://github.com/dhuertas/AES/blob/master/aes.c
3 參考文獻
[1] William Stallings著遂鹊;王張宜等譯. 密碼編碼學與網(wǎng)絡(luò)安全——原理與實踐(第五版)[M]. 北京:電子工業(yè)出版社,2011.1.