AES(Rijndael)使用一个密钥生成方案把一个短密钥扩展成各轮用于加密的子密钥。该方案的名称就叫做Rijndael密钥生成方案(Rijndael key schedule)。对于不同位数的原始密钥(128, 192, 256),加密的轮次是不相同的,但每一轮都需要与128位的密钥進行异或,而根据原始密钥生成各轮子密钥的过程就是由Rijndael密钥生成方案完成的。
公共操作(Common operations)
在描述密钥生成的流程之前,有必要先阐述Rijndael密钥生成方案所使用的一些公共操作。
旋转(Rotate)
对于下面32位的字(十六进制):
1D 2C 3A 4F
旋转操作会把它循环左移8位(一个字节),即左边的高8位会成为右边的低8位,结果如下:
2C 3A 4F 1D
求2的幂次操作(Rcon)
Rcon在Rijndael的参考文档里称为求2的幂次。需要注意的是这个操作不是作用在常规的整数域中的,它是作用在Rijndael有限域中的。2的多项式形式为2 = 00000010 = 0 x^7 + 0 x^6 + 0 x^5 + 0 x^4 + 0 x^3 + 0 x^2 + 1 x + 0 = b,计算的公式为:
:\textrm{rcon}(i) = 2^{i-1} = 22^{i-2} = 2\textrm{rcon}(i-1)
或者等价于,
:\textrm{rcon}(i) = b^{i-1} \bmod x^8 + x^4 + x^3 + x + 1
金鑰排程(The key schedule)
在 AES 中定義了幾個參數:
- 以 32 位元字組(Word)為單位的金鑰長度,例如:AES-128 為四個字組、AES-192 為六個字組、AES-256 為八個字組。
- 是需要的回合金鑰數量,例如:AES-128 需要 11 把回合金鑰、AES-192 需要 13 把回合金鑰、AES-256 需要 15 把回合金鑰。
- , , ... 是總共需要擴展的字組數目。
RotWord 被定義為一個左循環移位(1 次移動1 byte)的操作:
:\operatorname{RotWord}(\begin{bmatrix} b_0 & b_1 & b_2 & b_3 \end{bmatrix}) = \begin{bmatrix} b_1 & b_2 & b_3 & b_0 \end{bmatrix}
SubWord 被定義為一個利用 AES 的S-box讓字組做非線性轉換的操作:
:\operatorname{SubWord}(\begin{bmatrix} b_0 & b_1 & b_2 & b_3 \end{bmatrix}) = \begin{bmatrix} \operatorname{S}(b_0) & \operatorname{S}(b_1) & \operatorname{S}(b_2) & \operatorname{S}(b_3) \end{bmatrix}
最後依照 i 值(i = 0 \ldots 4R-1)做下列運算:
:W_i =
\begin{cases}
K_i & \text{if } i 6 \text{, and } i \equiv 4 \pmod{N} \\
W_{i-N} \oplus W_{i-1} & \text{otherwise.} \\
\end{cases}
评论 (0)