【正文】
k01 k02 k03 k10 k11 k12 k13 k20 k21 k22 k23 k30 k31 k32 k33 y k y _ w e n f e n g @ 1 6 3 . c o m2022/8/25 Page: 78 AES: 迭代輪數(shù)與密鑰、消息分組的關(guān)系 ? Rijndael算法同 DES一樣,由多基本的變換單位“輪”多次迭代而成。 ? 迭代輪數(shù)與密鑰、消息分組的關(guān)系表,其中 ? 以 Nr表示迭代輪數(shù) ? Nb表示消息分組按字節(jié)劃分的矩陣列數(shù) (行數(shù)等于 4) ? Nk表示密鑰分組按字節(jié)劃分的矩陣列數(shù) (行數(shù)等于 4) Nr Nb=4 Nb=6 Nb=8 Nk=4 10 12 14 Nk=6 12 12 14 Nk=8 14 14 14 y k y _ w e n f e n g @ 1 6 3 . c o m2022/8/25 Page: 79 AES: 輪變換 ? 輪變換 — Round(State, RoundKey) ? State:輪消息矩陣,既作為輸入,又作為輸出; ? RoundKey:輪密鑰矩陣,它由輸入密鑰通過密鑰表導(dǎo)出。 ? 輪變換由四個不同的變換組成 (除最后一輪 ) ? 最后一輪記為 FinalRound(State, RoundKey) ? 它等于不使用 MixColumns函數(shù)的 Round(State, RoundKey) Round(State, RoundKey) { SubBytes(State)。 ShiftRows(State)。 MixColumns(State)。 AddRoundKey(State, RoundKey)。 } y k y _ w e n f e n g @ 1 6 3 . c o m2022/8/25 Page: 80 AES: SubBytes(State) ? SubBytes為 State的每一個字節(jié)提供一個 非線形變換 ,任一非零字節(jié) x∈ GF(28)被下面的變換所代換 (仿射變換 ) y = Ax1 + b y k y _ w e n f e n g @ 1 6 3 . c o m2022/8/25 Page: 81 AES: SubBytes(State) ? 查表法 —— 定時分析攻擊 ? 計算 x1 ——(x, x1) ? 計算 y——包含矩陣 A和向量 b, (x, y) a00 a01 a02 a03 a04 a05 a10 a11 a12 a13 a14 a15 a20 a21 a22 a23 a24 a25 a30 a31 a32 a33 a34 a35 b00 b01 b02 b03 b04 b05 b10 b11 b12 b13 b14 b15 b20 b21 b22 b23 b24 b25 b30 b31 b32 b33 b34 b35 Sbox aij bij y k y _ w e n f e n g @ 1 6 3 . c o m2022/8/25 Page: 82 AES: ShiftRows(State) ? ShiftRows在 State的每行運算,它只重排了元素的位置而不改變元素本身,實質(zhì)為 換位密碼, 以 128比特的明文長度為例 ? 對在第 i行的元素,換位變換就是“循環(huán)向右移動” 4 – i個位置。 ? 字節(jié)移位關(guān)系表 Nb C1 C2 C3 4 3 2 1 6 3 2 1 8 3 1 4 y k y _ w e n f e n g @ 1 6 3 . c o m2022/8/25 Page: 83 AES: MixColumns(State) ? MixColumns在 State的每列上作用, 列作為 GF(28)上的多項式, 每次迭代的輸出為一列 s’(x) = c(x) . s(x) mod(x4 + 1) 其中, c(x) = {03} . x3 + {01} . x3 + {01} . x3 + {02}, {}內(nèi)的數(shù)表示字節(jié) c(x)與 x4 + 1互素 y k y _ w e n f e n g @ 1 6 3 . c o m2022/8/25 Page: 84 AES: AddRoundKey操作 ? 按比特在 F2上相加 (XOR) a00 a01 a02 a03 a04 a05 a10 a11 a12 a13 a14 a15 a20 a21 a22 a23 a24 a25 a30 a31 a32 a33 a34 a35 k00 k01 k02 k03 k04 k05 k10 k11 k12 k13 k14 k15 k20 k21 k22 k23 k24 k25 k30 k31 k32 k33 k34 k35 ? = b00 b01 b02 b03 b04 b05 b10 b11 b12 b13 b14 b15 b20 b21 b22 b23 b24 b25 b30 b31 b32 b33 b34 b35 y k y _ w e n f e n g @ 1 6 3 . c o m2022/8/25 Page: 85 AES: 密鑰編排 ? 密鑰編排 ? 密鑰編排是指從種子密鑰得到輪密鑰的過程,它由密鑰擴展和輪密鑰選取兩部分組成 ? 輪密鑰的比特數(shù)等于分組長度乘以輪數(shù)加 1 = [32 Nb (Nr + 1)]; ? 種子密鑰被擴展成為擴展密鑰; ? 輪密鑰從擴展密鑰中取,其中第 1輪輪密鑰取擴展密鑰的前 Nb個字,第 2輪輪密鑰取接下來的 Nb個字,如此下去。 y k y _ w e n f e n g @ 1 6 3 . c o m2022/8/25 Page: 86 AES: KeyExpansion(key[], w[]) ? KeyExpansion(key[], w[]) ? key[]用于存儲擴展前的密鑰; ? w[]用于存儲擴展后的密鑰; ? 以 128比特的密鑰為例 ? 輸入的密鑰 key[]直接被復(fù)制到密鑰數(shù)組的前四個字, w[0], w[1], w[2], w[3]; ? w數(shù)組中下標(biāo)不為 4的倍數(shù)的元素按以下規(guī)則擴展 w[i] = w[i 1] ⊕ w[i 4] y k y _ w e n f e n g @ 1 6 3 . c o m2022/8/25 Page: 87 AES: KeyExpansion(key[], w[]) ? 下標(biāo)為 4的倍數(shù)的元素按以下規(guī)則擴展 ? 將一個字的四個字節(jié)循環(huán)左移一個字節(jié) , 即將 [b0, b1, b2, b3]變?yōu)閇b1, b2, b3, b0]; ? 基于 SubBytes對輸入字中的每個字節(jié)進行代替; ——S盒 ? 將步驟 1和步驟 2的結(jié)果再與輪常量 Rcon[i]相異或 。 ? Rcon[i] = (RC[i], ‘00’, ‘00’, ‘00’) ? RC[1] = ‘01’ ? RC[i] = 2 . (RC[i 1]) y k y _ w e n f e n g @ 1 6 3 . c o m2022/8/25 Page: 88 AES: KeyExpansion() Nk≤6 KeyExpansion(byte key[4 * Nk], word w[Nb * (Nr + 1)]) { for(i = 0。 i Nk。 i++) { w[i] = (key[4 * i], key[4 * i + 1], key[4 * i + 2], key[4 * i + 3])。 } for(i = Nk。 i Nb * (Nr + 1)。 i++) { temp = w[i 1]。 if(i % Nk == 0) temp = SubBytes(temp 8)^Rcon[i / Nk]。 w[i] = w[i Nk]^temp。 } } y k y _ w e n f e n g @ 1 6 3 . c o m2022/8/25 Page: 89 AES: KeyExpansion() Nk6 KeyExpansion(byte key[4 * Nk], word w[Nb * (Nr + 1)]) { for(i = 0。 i Nk。 i++) { w[i] = (key[4 * i], key[4 * i +1], key[4 * i + 2], key[4 * i +3])。 } for(i = Nk。 i Nb * (Nr + 1)。 i++) { temp = w[i 1]。 if(i % Nk == 0) temp = SubBytes(temp 8)^Rcon[i/ Nk]。 else if(i % Nk == 4) temp = SubBytes(temp 8)。 w[i] = w[i Nk]^temp。 }。 }。 y k y _ w e n f e n g @ 1 6 3 . c o m2022/8/25 Page: 90 AES: 加密 Rijndael(State,CipherKey) { KeyExpansion(CipherKey, ExpandedKey)。 AddRoundKey(State, ExpandedKey) for(i = 1。 i Nr。 ++i) { ByteSub(State)。 ShiftRow(State)。 MixColumn(State)。 AddRoundKey(State, ExpandedKey + Nb * i)。 } ByteSub(State)。 ShiftRow(State)。 AddRoundKey(State, ExpandedKey + Nb * i)。 } y k y _ w e n f e n g @ 1 6 3 . c o m2022/8/25 Page: 91 AES: 解密 AddRoundKey() for(i = 1。 i Nr。 ++i) { SubBytes()。 ShiftRow()。 MixColumn()。 AddRoundKey() } ByteSub()。 ShiftRow()。 AddRoundKey() I_AddRoundKey() I_ShiftRow()。 I_ByteSub()。 for(i = 1。 i Nr。 ++i) { I_AddRoundKey() I_MixColumn()。 I_ShiftRow()。 I_SubBytes()。 } I_AddRoundKey() I_AddRoundKey() for(i = 1。 i Nr。 ++i) { I_ShiftRow()。 I_SubBytes()。 I_AddRoundKey() I_MixColumn()。 } I_ShiftRow()。 I_ByteSub()。 I_AddRoundKey() y k y _ w e n f e n g @ 1 6 3 . c o m2022/8/25 Page: 92 AES: 安全性分析 ? 對比其它算法的 ? 消除了 DES中出現(xiàn)的弱密鑰的可能 ? 消除了 IDEA中發(fā)現(xiàn)的弱密鑰 ? 能有效抵抗目前已知的攻擊算法 ? 線性攻擊 ? 差分攻擊