天天看點

密碼算法詳解——AES0 AES簡介1 算法流程2 源碼3 參考文獻

轉載 :http://www.mamicode.com/info-detail-514466.html

0 AES簡介

  美國國家标準技術研究所在2001年釋出了進階加密标準(AES)。AES是一個對稱分組密碼算法,旨在取代DES成為廣泛使用的标準。

  根據使用的密碼長度,AES最常見的有3種方案,用以适應不同的場景要求,分别是AES-128、AES-192和AES-256。本文主要對AES-128進行介紹,另外兩種的思路基本一樣,隻是輪數會适當增加。

1 算法流程

  AES加解密的流程圖如下:

密碼算法詳解——AES0 AES簡介1 算法流程2 源碼3 參考文獻

AES加密過程涉及到4種操作:位元組替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和輪密鑰加(AddRoundKey)。解密過程分别為對應的逆操作。由于每一步操作都是可逆的,按照相反的順序進行解密即可恢複明文。

加解密中每輪的密鑰分别由初始密鑰擴充得到。算法中16位元組的明文、密文和輪密鑰都以一個4x4的矩陣表示。

  接下來分别對上述5種操作進行介紹。

1.1 位元組代替

  位元組代替的主要功能是通過S盒完成一個位元組到另外一個位元組的映射。S盒的詳細構造方法可以參考文獻[1]。

  下圖(a)為S盒,圖(b)為S-1(S盒的逆)。

密碼算法詳解——AES0 AES簡介1 算法流程2 源碼3 參考文獻
密碼算法詳解——AES0 AES簡介1 算法流程2 源碼3 參考文獻

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矩陣内部位元組之間的置換。

密碼算法詳解——AES0 AES簡介1 算法流程2 源碼3 參考文獻

實際移位的操作即是:第一行儲存不變,第二行循環左移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 正向列混淆

  正向列混淆的原理圖如下:

密碼算法詳解——AES0 AES簡介1 算法流程2 源碼3 參考文獻

根據矩陣的乘法可知,在列混淆的過程中,每個位元組對應的值隻與該列的4個值有關系。此處的乘法和加法都是定義在GF(28)上的,需要注意如下幾點:

    1) 将某個位元組所對應的值乘以2,其結果就是将該值的二進制位左移一位,如果該值的最高位為1(表示該數值不小于128),則還需要将移位後的結果異或00011011;[1]

    2) 乘法對加法滿足配置設定率,例如:07·S0,0=(01⊕02⊕04)·S0,0= S0,0⊕(02·S0,0)(04·S0,0)

    3) GF(2^8)加法就是異或(XOR)操作 ,C語言符号 ^ .

  假設某一列的值如下圖,運算過程如下:

密碼算法詳解——AES0 AES簡介1 算法流程2 源碼3 參考文獻
密碼算法詳解——AES0 AES簡介1 算法流程2 源碼3 參考文獻

同理可以求出另外幾個值。

1.3.2 逆向列混淆

  逆向列混淆的原理圖如下:

密碼算法詳解——AES0 AES簡介1 算法流程2 源碼3 參考文獻

由于:

密碼算法詳解——AES0 AES簡介1 算法流程2 源碼3 參考文獻

說明兩個矩陣互逆,經過一次逆向列混淆後即可恢複原文。

1.4 輪密碼加

  任何數和自身的異或結果為0。加密過程中,每輪的輸入與輪密鑰異或一次;是以,解密時再異或上該輪的密鑰即可恢複輸入。

1.5 密鑰擴充

  密鑰擴充的原理圖如下:

密碼算法詳解——AES0 AES簡介1 算法流程2 源碼3 參考文獻

密鑰擴充過程說明:

    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 源碼

  在GitHub上找到的AES實作代碼,感覺寫得不錯。

  https://github.com/dhuertas/AES/blob/master/aes.c

3 參考文獻

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

AES