public Aes(KeySize keySize, byte[] keyBytes)
{
SetNbNkNr(keySize); // 設定 Nb=4, Nk=4/6/8, Nr=10/12/14
this.key = new byte[Nk * 4];
keyBytes.CopyTo(this.key, 0); // 複製種子金鑰
BuildSbox(); // 建構 Sbox[16,16]
BuildInvSbox(); // 建構 iSbox[16,16]
BuildRcon(); // 輪常數表 Rcon[Nr+1, 4]
KeyExpansion(); // 生成金鑰調度表 w[Nb*(Nr+1), 4]
}
偽代碼:
for row = Nk to Nb*(Nr+1)-1
temp = w[row-1]
if row % Nk == 0
temp = SubWord(RotWord(temp)) XOR Rcon[row/Nk]
else if Nk == 8 and row % Nk == 4
temp = SubWord(temp)
w[row] = w[row-Nk] XOR temp
RotWord:4 位元組左循環移 1 位。SubWord:每位元組經 S-box 替換。Rcon:左欄為 GF(2^8) 中 2 的冪次,Rcon[i] = Rcon[i-1] * 0x02。種子金鑰前 6 輄:00 01 ... 17
row=6: temp = w[5] = 14 15 16 17
RotWord -> 15 16 17 14
SubWord -> 59 47 F0 FA
XOR Rcon[1] (01 00 00 00) -> 58 47 F0 FA
XOR w[0] (00 01 02 03) -> 58 46 F2 F9 = w[6]
State = plainText 複製
AddRoundKey(State, w[0..3]) // 第 0 輪金鑰
for round = 1 to Nr-1
SubBytes(State) // S-box 替換
ShiftRows(State) // Row i 左移 i 位
MixColumns(State) // GF(2^8) 矩陣乘法
AddRoundKey(State, w[round*4 .. round*4+3])
// 最後一輪略過 MixColumns
SubBytes, ShiftRows, AddRoundKey
cipherText = State
gfmultby02(b):b < 0x80 ? b<<1 : (b<<1) ^ 0x1Bgfmultby03(b):gfmultby02(b) ^ btemp = State 複製
State[r, (c + r) % Nb] = temp[r, c] // 利用模運算單行實現左移