【正文】
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)出。 ? 輪變換由四個(gè)不同的變換組成 (除最后一輪 ) ? 最后一輪記為 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的每一個(gè)字節(jié)提供一個(gè) 非線形變換 ,任一非零字節(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) ? 查表法 —— 定時(shí)分析攻擊 ? 計(jì)算 x1 ——(x, x1) ? 計(jì)算 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的每行運(yùn)算,它只重排了元素的位置而不改變?cè)乇旧恚瑢?shí)質(zhì)為 換位密碼, 以 128比特的明文長(zhǎng)度為例 ? 對(duì)在第 i行的元素,換位變換就是“循環(huán)向右移動(dòng)” 4 – i個(gè)位置。 ? 字節(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)上的多項(xiàng)式, 每次迭代的輸出為一列 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: 密鑰編排 ? 密鑰編排 ? 密鑰編排是指從種子密鑰得到輪密鑰的過程,它由密鑰擴(kuò)展和輪密鑰選取兩部分組成 ? 輪密鑰的比特?cái)?shù)等于分組長(zhǎng)度乘以輪數(shù)加 1 = [32 Nb (Nr + 1)]; ? 種子密鑰被擴(kuò)展成為擴(kuò)展密鑰; ? 輪密鑰從擴(kuò)展密鑰中取,其中第 1輪輪密鑰取擴(kuò)展密鑰的前 Nb個(gè)字,第 2輪輪密鑰取接下來的 Nb個(gè)字,如此下去。 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[]用于存儲(chǔ)擴(kuò)展前的密鑰; ? w[]用于存儲(chǔ)擴(kuò)展后的密鑰; ? 以 128比特的密鑰為例 ? 輸入的密鑰 key[]直接被復(fù)制到密鑰數(shù)組的前四個(gè)字, w[0], w[1], w[2], w[3]; ? w數(shù)組中下標(biāo)不為 4的倍數(shù)的元素按以下規(guī)則擴(kuò)展 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ī)則擴(kuò)展 ? 將一個(gè)字的四個(gè)字節(jié)循環(huán)左移一個(gè)字節(jié) , 即將 [b0, b1, b2, b3]變?yōu)閇b1, b2, b3, b0]; ? 基于 SubBytes對(duì)輸入字中的每個(gè)字節(jié)進(jìn)行代替; ——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: 安全性分析 ? 對(duì)比其它算法的 ? 消除了 DES中出現(xiàn)的弱密鑰的可能 ? 消除了 IDEA中發(fā)現(xiàn)的弱密鑰 ? 能有效抵抗目前已知的攻擊算法 ? 線性攻擊 ? 差分攻擊