AES算法簡介


AES算法簡介

一、 AES的結構

 

1、總體結構

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

clip_image002

2、明文密鑰組織方式

(@2CQP15US3}R09LZ7F8RRN

 

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

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

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

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

 

4、詳細過程

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

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

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

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

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

clip_image006

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

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

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

 

二、AES的變換函數

 

1、字節替代

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

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

clip_image008

clip_image010

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

0$PX88P2L$T6LT29YSANZ~R

 

2、行移位

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

行移位變換的例子:

45~C`_81$YB%UO)()H%$USH

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

 

3、列混淆

正向和逆向變換。

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

列混淆例子:

M3SVEDHJ`%LE]4Z5583E2X9

計算過程:

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

其中:

02•87 = 02•10000111B = 00001110B⊕00011011B = 00010101B = 15

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

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

01•46 = 46

01•A6 = A6

15⊕B2⊕46⊕A6 = 47

注意: G(28)上的運算

加法:按位異或

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

[874JN)~DR[P)O7[DYXPOSS

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

W@A@2QH)IJ9GT1`8JY$$UZQ

 

4、輪密鑰加

正向和逆向變換。

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

3VLGY(@14ISB)WAH8$7MMIC

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

A⊕B⊕B = A

單輪AES輸入:

clip_image021

 

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 );

}

 

三、密鑰擴展

clip_image023

clip_image025

clip_image027

clip_image029

 

密鑰擴展偽代碼描述

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)]

clip_image031

 

五、參考文獻

[1] William Stallings著;王張宜等譯. 密碼編碼學與網絡安全——原理與實踐(第五版)[M]. 北京:電子工業出版社,2012.1.

[2]密碼算法詳解——AES

[3]AES加密算法動畫演示


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM