算法簡介
AES本質是一種對稱分組密碼體制,采用代替/置換網絡。每輪由三層組成:線性混合層確保多輪之上的高度擴散,非線性層由16個S盒并置起到混淆的作用,秘鑰加密層將子秘鑰異或到中間狀態。
AES加密數據塊和秘鑰長度可以是128比特,192比特,256比特,AES加密有很多輪的重復和變換。
大致步驟如下:
- 1、秘鑰擴展(KeyExpansion)
- 2、初始化輪(Initial Round)
- 3、重復輪(Rounds),每一輪又包括:SubBytes,ShiftRows,MixColumns,AddRoundKey
- 4、最終輪(Final Round),最終輪沒有MixColums)
AES的輪函數
字節代換 (SubBytes)
非線性代換,獨立地對狀態的每個字節進行,并且代換表(S盒)可逆,記為ByteSub(State),分兩步:
- (1)將字節作為GF(28)上的元素映射到自己的逆元
- (2)將字節做GF(2)上的放射變換,即 y=Ax-1+B,其中A是一個GF(2)上8?8的可逆矩陣,B是GF(2)上一個8位列向量
AES的S盒
S盒的使用:輸入8a,輸出就是7e
逆字節代換
逆字節替代變換是字節替代變換的逆變換,在狀態的每個字節上應用逆S盒
y=A-1(x-B)
輸入7e,輸出8a
上述S-盒對狀態的所有字節所做的變換記為ByteSub (State)
行移位(ShiftRow)
將狀態陣列的各行進行循環移位,不同行的移位量不同:
- 0行:不動
- 1行:循環左移C1字節
- 2行:循環左移C2字節
- 3行:循環左移C3字節
算法中間的結果也需要分組,稱之為狀態,狀態可以用以字節為元素的矩陣陣列表示,該陣列有4行,列數Nb為分組長度除32,可看成字節組成的一維數組。
Nb=6的狀態陣列
行移位示意圖:
逆行移位
逆行移位變換是行移位變換的逆變換,它對狀態的每一行進行循環右移
- 第0行保持不變
- 第1行循環右移C1個字節
- 第2行循環右移C2個字節
- 第3行循環右移C3個字節
列混淆(MixColumn)
將每列視為GF(28)上多項式,與固定的多項式c(x)進行模x4+1乘法,要求c(x)模x4+1可逆。
列混淆運算也可寫為矩陣乘法。
示意圖:
輪密鑰加(AddRoundKey)
輪密鑰與狀態進行逐比特異或。輪密鑰由種子密鑰通過密鑰編排算法得到。輪密鑰長度與分組長度相同
密鑰編排
密鑰編排指從種子密鑰得到輪密鑰的過程,它由密鑰擴展和輪密鑰選取兩部分組成。其基本原則如下:
- (1)輪密鑰的比特數等于分組長度乘以輪數加1;例如要將128比特的明文經過10輪的加密,則總共需要(10+1)*128=1408比特的密鑰。
- (2)種子密鑰被擴展成為擴展密鑰;
- (3)輪密鑰從擴展密鑰中取,其中第1輪輪密鑰取擴展密鑰的前Nb個字,第2輪輪密鑰取接下來的Nb個字,如此下去。
密鑰擴展
擴展密鑰是以4字節字為元素的一維陣列,表示為W[Nb* (Nr+1)],其中前Nk個字取為種子密鑰,以后每個字按遞歸方式定義。擴展算法根據Nk≤6和Nk>6有所不同。
種子密鑰:以字節為元素的矩陣陣列描述,陣列為4行,列數Nk為密鑰長度除32
Nk=4的情況:
Nk<=6
輪密鑰選取
輪密鑰i(即第i 個輪密鑰)由輪密鑰緩沖字W[Nb* i]到W[Nb*(i+1)]給出,如圖所示。