AES 解密(InvCipher)按加密步驟逆序執行逆運算:InvShiftRows、InvSubBytes、AddRoundKey、InvMixColumns。注意:
AddRoundKey 而非 InvAddRoundKey(XOR 可逆,自我逆)。使用 iSbox[] 替代 Sbox[]。若 Sbox[0x20] = 0xB7,則 iSbox[0xB7] = 0x20。
係數為 0x0E, 0x0B, 0x0D, 0x09(加密為 0x01, 0x02, 0x03):
State[0,c] = 0x0E*State[0,c] + 0x0B*State[1,c] + 0x0D*State[2,c] + 0x09*State[3,c]
State[1,c] = 0x09*State[0,c] + 0x0E*State[1,c] + 0x0B*State[2,c] + 0x0D*State[3,c]
State[2,c] = 0x0D*State[0,c] + 0x09*State[1,c] + 0x0E*State[2,c] + 0x0B*State[3,c]
State[3,c] = 0x0B*State[0,c] + 0x0D*State[1,c] + 0x09*State[2,c] + 0x0E*State[3,c]
0x0E = 0x08 + 0x04 + 0x02 = 2^3 + 2^2 + 2^1,利用既有 gfmultby02 疊加:
return (byte)(
(int)gfmultby02(gfmultby02(gfmultby02(b))) ^ // 2^3
(int)gfmultby02(gfmultby02(b)) ^ // 2^2
(int)gfmultby02(b) // 2^1
);
Aes aes = new Aes(keySize, seedKey);
aes.Cipher(plainText, cipherText);
aes.InvCipher(cipherText, decipheredText);
針對位元組陣列操作,配合 Encoding.Unicode 即可加解密字串。Demo 程式(圖 16)接受 8 字元字串(16 位元組)演示完整流程。
