AES 轮密钥(子密钥如何生成).md

我的笔记: http://caf99af3.wiz03.com/share/s/3a-pHP3y4ABk2SLM5t03faoi2zxPEL18M4g92m15dS0FLt3J

AES首先将初始密钥输入到一个4*4矩阵中。这个4*4矩阵的每一列的4个字节组成一个字,矩阵4列的4个字依次命名为w[0]、w[1]、w[2]和 w[3]。它们构成了一个以字为单位的数组 w。
接着,对w数组扩充 40 个新列,构成总共 44 列的扩展密码数组。新列以如下的递归方式产生:
(1)如果 i 不是 4 的倍数,那么第 i 列由如下等式确定:
w [ i ] = w [ i − 4 ] ⊕ w [ i − 1 ] w[i]=w[i-4]⊕w[i-1] w[i]=w[i4]w[i1]
(2)如果i是4的倍数,那么第i列由如下等式确定:
w [ i ] = w [ i − 4 ] ⊕ T ( w [ i − 1 ] ) w[i]=w[i-4]⊕T(w[i-1]) w[i]=w[i4]T(w[i1])其中,T是一个复杂的函数。
函数T由三个部分组成:自循环、字节代换和轮常量异或,这三部分的作用分别如下:
(1)字循环:将 1 个字中的 4 个字节循环左移1个字节。
(2)字节代换:对字循环的结果使用S盒进行字节代换。
(3)轮常量异或:将前两步的结果同轮常量 Rcon[j] 进行异或,其中J表示轮数。

轮常量Rcon[j]是一个字,其值见下表。

j 1 2 3 4 5
Rcon[j] 01 00 00 00 02 00 00 00 04 00 00 00 08 00 00 00 10 00 00 00
j 6 7 8 9 10
Rcon[j] 20 00 00 00 40 00 00 00 80 00 00 00 1B 00 00 00 36 00 00 00

下面举个例子:
设初始的128位密钥为:
3C A1 0B 21 57 F0 19 16 90 2E 13 80 AC C1 07 BD
那么4个初始值为:
W[0] = 3C A1 0B 21
W[1] = 57 F0 19 16
W[2] = 90 2E 13 80
W[3] = AC C1 07 BD
下面求扩展的第1轮的子密钥(W[4],W[5],W[6],W[7])。
由于4是4的倍数,所以:
W[4] = W[0] ⨁ T(W[3])
T(W[3])的计算步骤如下:

  1. 循环地将W[3]的元素移位:AC C1 07 BD 变成 C1 07 BD AC;
  2. 将 C1 07 BD AC 作为S盒的输入,输出为78 C5 7A 91;
  3. 将78 C5 7A 91与第一轮轮常量Rcon[1]进行异或运算,将得到79 C5 7A 91,因此,T(W[3])=79 C5 7A 91,故
    W[4] = 3C A1 0B 21 ⨁ 79 C5 7A 91 = 45 64 71 B0
    其余的3个子密钥段的计算如下:
    W[5] = W[1] ⨁ W[4] = 57 F0 19 16 ⨁ 45 64 71 B0 = 12 94 68 A6
    W[6] = W[2] ⨁ W[5] =90 2E 13 80 ⨁ 12 94 68 A6 = 82 BA 7B 26
    W[7] = W[3] ⨁ W[6] = AC C1 07 BD ⨁ 82 BA 7B 26 = 2E 7B 7C 9B
    所以,第一轮的密钥为 45 64 71 B0 12 94 68 A6 82 BA 7B 26 2E 7B 7C 9B。

你可能感兴趣的:(密码)