AES算法簡介

一、 AES的結構

 

1、總體結構

明文分組的長度爲128位即16字節,密鑰長度可以爲1624或者32字節(128192256)。根據密鑰的長度,算法被稱爲AES-128AES-192或者AE-256

2、明文密鑰組織方式

 

3、一些相關的的術語定義和表示

• 狀態(State:密碼運算的中間結果稱爲狀態。

• State的表示:狀態用以字節爲基本構成元素的矩陣陣列來表示,該陣列有4行,列數記爲Nb Nb=分組長度(bits÷ 32Nb可以取的值爲4,對應的分組長度爲128bits

• 密碼密鑰(CipherKey)的表示 Cipher Key類似地用一個4行的矩陣陣列來表示,列數記爲NkNk=密鑰長度(bits÷32Nk可以取的值爲468,對應的密鑰長度爲128 192 256 bits

 

4、詳細過程

由四個不同的變換組成,包括一個置換和三個替代:

字節代替(SubBytes)用一個S盒完成分組的字節到字節的代替。

行移位(ShiftRows):一個簡單的置換。

列混淆(MixColumns):利用域GF(28)上的算術特性的一個代替。

輪密鑰加(AddRoundKey):當前分組和擴展密鑰的一部分進行按位XOR(異或)

輸入的密鑰被擴展成由4432位子所組成的數組w[i],由上圖可知,每輪有四個不同的字(128)作爲該輪到密鑰。

對加密和解密的操作,算法由輪密鑰加開始,接着執行9輪迭代運算,每輪都包含所有4個階段的代替,接着是第10輪的三個階段。

僅僅在輪密鑰加階段使用密鑰。由於這個原因,該算法以輪密鑰加開始,以輪密鑰加結束。

 

二、AES的變換函數

 

1、字節替代

正向和逆向變換。被稱爲字節代替的正向字節代替變換是一個簡單的查表操作。

映射方式:把該字節的高4位作爲行值,低4位作爲列值,以這些行列值作爲索引從S盒中對應位置取出元素作爲輸出。例如,十六進制數{95}所對應的S盒的行值是9,列值是5S盒中在此位置的值是{2A},相應的{95}被映射爲{2A}

 

下面是一個字節代替的例子:

 


2、行移位

正向和逆向變換。正向行移位,state的第一行保持不變。把state的第二行循環左移一個字節,state的第三行循環左移兩個字節,state的第四行循環左移三個字節。

行移位變換的例子:

逆向行移位將state中的後三行執行相反方向的移位操作,如第二行向右循環移位一個字節,其他類似操作。

 

3、列混淆

正向和逆向變換。

列混淆變換的正向列混淆變換對每列獨立地進行操作。每列中的每個字節被映射爲一個新值,此值由該列中的4個字節通過函數變換得到。

列混淆例子:

計算過程:

47 = (02•87)(03•6E)(01•4A)(01•A6)

其中:

02•87 = 02•10000111= 00001110B00011011B =00010101B = 15

03•6E = (0102)•6E = (01•6E)(02•6E)

         = 01101110B(11011100B)= 10110010B = B2

01•46 = 46

01•A6 = A6

15B246A6 = 47

注意: G(28)上的運算

加法:按位異或

乘法:可通過對多箇中間結果的移位運算和異或一個特定的比特串(比如00011011)實現。(與最高位b7有關)

逆向列混淆變換可以再乘以矩陣的逆得到

 

4、輪密鑰加

正向和逆向變換。

在輪密鑰加中,128位的state按位與128位的輪密鑰XOR

逆向輪密鑰加變換是和正向輪密鑰加變換一樣的,因爲異或操作是其本身的逆。

ABB = A

單輪AES輸入:

 

5、用僞代碼表示的Rijndael加密算法


Rijndael ( State, CipherKey )

{

KeyExpansion ( CipherKey, ExpandedKey );

AddRoundKey ( State, ExpandedKey );

For ( i=1; i<Rnd; i++ )

       Round ( State, ExpandedKey+ Nb*i );

FinalRound ( State, ExpandedKey + Nb*Rnd );

}

 

三、密鑰擴展

 

密鑰擴展僞代碼描述


KeyExpansion ( byte, Key[16],word w[44] )

{

word temp;

for (i = 0;i < 4; i++)

     w[i] = (key[4*i],key[4*i+1],key[4*i+2], key[4*i+3]);

for (i = 4;i < 44; i++)

{   temp = w[i - 1];

    if (i mod 4 = 0) temp =SubWord(RotWord(temp)) + Rcon[i/4];

    w[i] = w[i-4] + temp;

}

}


輸入密鑰直接被複制到擴展密鑰數組的前四個字節。然後每次用四個字節填充擴展密鑰數組餘下的部分。在擴展密鑰數組中,每一個新增的字w[i]的值依賴於w[i-1] w[i-4]

 

四、等價的解密算法

 

交換逆向行移位和逆向字節代替

逆向移行[逆向字節代替(Si)] = 逆向字節代替[逆向移行 (Si)]

交換輪密鑰加和逆向列混淆

逆向列混淆(Siwj) = [逆向列混淆(Si)][逆向列混淆(wj)]

 





Good luck!

Write by Jimmy.li












發佈了74 篇原創文章 · 獲贊 76 · 訪問量 71萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章