AES密碼算法原理詳解
0 AES簡介
美國國家標準技術研究所在2001年發佈了高級加密標準(AES)。AES是一個對稱分組密碼算法,旨在取代DES成爲廣泛使用的標準。
根據使用的密碼長度,AES最常見的有3種方案,用以適應不同的場景要求,分別是AES-128、AES-192和AES-256。本文主要對AES-128進行介紹,另外兩種的思路基本一樣,只是輪數會適當增加。
1 算法流程
AES加解密的流程圖如下:
AES加密過程涉及到4種操作:字節替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和輪密鑰加(AddRoundKey)。解密過程分別爲對應的逆操作。由於每一步操作都是可逆的,按照相反的順序進行解密即可恢復明文。加解密中每輪的密鑰分別由初始密鑰擴展得到。算法中16字節的明文、密文和輪密鑰都以一個4x4的矩陣表示。
接下來分別對上述5種操作進行介紹。
1.1 字節代替
字節代替的主要功能是通過S盒完成一個字節到另外一個字節的映射。S盒的詳細構造方法可以參考文獻[1]。
下圖(a)爲S盒,圖(b)爲S-1(S盒的逆)。
S和S-1分別爲16x16的矩陣。假設輸入字節的值爲a=a7a6a5a4a3a2a1a0,則輸出值爲S[a7a6a5a4][a3a2a1a0],S-1的變換也同理。
例如:字節00替換後的值爲(S[0][0]=)63,再通過S-1即可得到替換前的值,(S-1 [6][3]=)00。
1.2 行移位
行移位的功能是實現一個4x4矩陣內部字節之間的置換。
1.2.1 正向行移位
正向行移位的原理圖如下:
實際移位的操作即是:第一行保存不變,第二行循環左移1個字節,第三行循環左移2個字節,第四行循環左移3個字節。假設矩陣的名字爲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)域上算術特性的一個代替。
1.3.1 正向列混淆
正向列混淆的原理圖如下:
根據矩陣的乘法可知,在列混淆的過程中,每個字節對應的值只與該列的4個值有關係。此處的乘法和加法都是定義在GF(28)上的,需要注意如下幾點:
1) 將某個字節所對應的值乘以02,其結果就是將該值的二進制位左移一位,如果該值的最高位爲1(表示該數值不小於128),則還需要將移位後的結果異或00011011;[1]
2) 乘法對加法滿足分配率,例如:07·S0,0=(01⊕02⊕04)·S0,0= S0,0⊕(02·S0,0)⊕(04·S0,0)
3) 此處的矩陣乘法與一般意義上矩陣的乘法有所不同,各個值在相加時使用的是模2加法(相當於是異或運算)。
假設某一列的值如下圖,運算過程如下:
同理可以求出另外幾個值。
1.3.2 逆向列混淆
逆向列混淆的原理圖如下:
由於:
說明兩個矩陣互逆,經過一次逆向列混淆後即可恢復原文。
1.4 輪密碼加
任何數和自身的異或結果爲0。加密過程中,每輪的輸入與輪密鑰異或一次;因此,解密時再異或上該輪的密鑰即可恢復輸入。
1.5 密鑰擴展
密鑰擴展的原理圖如下:
密鑰擴展過程說明:
1) 將初始密鑰以列爲主,轉化爲4個32 bits的字,分別記爲w[0…3];
2) 按照如下方式,依次求解w[j],其中j是整數並且屬於[4,43];
3) 若j%4=0,則w[j]=w[j-4]⊕g(w[j-1]),否則w[j]=w[j-4]⊕w[j-1];
函數g的流程說明:
4) 將w循環左移一個字節;
5) 分別對每個字節按S盒進行映射;
6) 與32 bits的常量(RC[j/4],0,0,0)進行異或,RC是一個一維數組,其值如下。(RC的值只需要有10個,而此處用了11個,實際上RC[0]在運算中沒有用到,增加RC[0]是爲了便於程序中用數組表示。由於j的最小取值是4,j/4的最小取值則是1,因此不會產生錯誤。)
RC = {00, 01, 02, 04, 08, 10, 20, 40, 80, 1B, 36}
2 源碼
3 參考文獻
[1] William Stallings著;王張宜等譯. 密碼編碼學與網絡安全——原理與實踐(第五版)[M]. 北京:電子工業出版社,2011.1.