概述
這里是波士頓大學的Howard Straubing做的一段很直白的動畫。
AES加密過程是在一個4×4的字節矩陣上運作,這個矩陣又稱為“體(state)”,其初值就是一個明文區塊(矩陣中一個
元素大小就是明文區塊中的一個Byte)。(Rijndael加密法因支持更大的區塊,其矩陣行數可視情況增加)加密時,
各輪AES加密循環(除最后一輪外)均包含4個步驟:
- AddRoundKey—矩陣中的每一個字節都與該次回合密鑰(round key)做XOR運算;每個子密鑰由密鑰生成方案產生。
- SubBytes—通過一個非線性的替換函數,用查找表的方式把每個字節替換成對應的字節。
- ShiftRows—將矩陣中的每個橫列進行循環式移位。
- MixColumns—為了充分混合矩陣中各個直行的操作。這個步驟使用線性轉換來混合每內聯的四個字節。最后一個加密循環中省略MixColumns步驟,而以另一個AddRoundKey替換。
表2.2 AES密鑰長度與輪數的關系
密鑰長度 | 128 | 192 | 256 |
圈數 | 10 | 12 | 14 |
S盒變換(SubBytes)
矩陣中的各字節通過一個8位的S-box進行轉換。這個步驟提供了加密法非線性的變換能力。S-box與GF(28)上的乘法反元素有關,已知具有良好的非線性特性。為了避免簡單代數性質的攻擊,S-box結合了乘法反元素及一個可逆的仿射變換矩陣建構而成。此外在建構S-box時,刻意避開了固定點與反固定點,即以S-box替換字節的結果會相當于錯排的結果。AES算法中的S盒如圖2.2所示
例如一個字節為0x19,經過S盒變換查找n(1,9) = 0xd4,所以就替換為0xd4。
行變換 (ShiftRows)
ShiftRows描述矩陣的行操作。在此步驟中,每一行都向左循環位移某偏移量。在AES中(區塊大小128位),第一行維持不變,第二行里的每個字節都向左循環移動一格。同理,第三行及第四行向左循環位移的偏移量就分別是2和3。經過ShiftRows之后,矩陣中每一豎列,都是由輸入矩陣中的每個不同列中的元素組成。
列變換 (MixColumns)
在MixColumns步驟,每一列的四個字節通過線性變換互相結合。每一列的四個元素分別當作 的系數,合并即為GF(28)中的一個多項式,接著將此多項式和一個固定的多項式在modulo 下相乘。此步驟亦可視為Rijndael有限域之下的矩陣乘法。MixColumns函數接受4個字節的輸入,輸出4個字節,每一個輸入的字節都會對輸出的四個字節造成影響。因此ShiftRows和MixColumns兩步驟為這個密碼系統提供了擴散性。
擴展密鑰(AddRoundKey)
AES算法利用外部輸入密鑰K(密鑰串的字數為Nk),通過密鑰的擴展程序得到共計4(Nr+1)字的擴展密鑰。它涉及如下三個模塊:
(1)位置變換(rotword)——把一個4字節的序列[A,B,C,D]變化成[B,C,D,A];
(2)S盒變換(subword)——對一個4字節進行S盒代替;
(3)變換Rcon[i]——Rcon[i]表示32位比特字[xi-1,00,00,00]。這里的x是(02),如 Rcon[1]=[01000000];Rcon[2]=[02000000];Rcon[3]=[04000000]……
擴展密鑰的生成:擴展密鑰的前Nk個字就是外部密鑰K;以后的字W[[i]]等于它前一個字W[[i-1]]與前第Nk個字W[[i-Nk]]的“異或”,即W[[i]]=W[[i-1]]W[[i- Nk]]。但是若i為Nk的倍數,則W[i]=W[i-Nk]Subword(Rotword(W[[i-1]]))Rcon[i/Nk]。