AES加密算法的密钥扩展算法详解
我将为您详细讲解AES加密算法中的密钥扩展过程,这是AES算法实现中至关重要的组成部分。
题目描述
AES密钥扩展算法(Key Expansion)的任务是将用户输入的初始密钥(128/192/256位)扩展成一个包含多个轮密钥的密钥调度表,为AES的每一轮加密提供相应的轮密钥。以最常用的AES-128为例,需要将128位初始密钥扩展成11个128位的轮密钥。
密钥扩展详细过程
1. 基本概念与参数
- AES-128:初始密钥128位(16字节),分为44个32位字(W[0]到W[43])
- 轮数:10轮,需要11个轮密钥(包含初始轮密钥)
- 每个轮密钥:128位 = 4个字(W[0]-W[3]为第0轮,W[4]-W[7]为第1轮,依此类推)
2. 核心变换函数
密钥扩展依赖于三个关键操作:
2.1 RotWord(字循环)
将1个字(4字节)循环左移1字节:
输入:[a0, a1, a2, a3] → 输出:[a1, a2, a3, a0]
2.2 SubWord(字替换)
对每个字节应用AES的S盒变换:
使用与加密过程中相同的S盒进行字节替换
2.3 Rcon(轮常量)
每轮使用不同的轮常量Rcon[i] = [RC[i], 0x00, 0x00, 0x00]
其中RC[1] = 0x01,RC[i] = 0x02 × RC[i-1](在GF(2⁸)域上)
3. 密钥扩展具体步骤
3.1 初始密钥装载
将16字节初始密钥按列优先顺序分为4个字:
W[0] = Key[0-3], W[1] = Key[4-7], W[2] = Key[8-11], W[3] = Key[12-15]
3.2 递归生成过程
对于i从4到43:
- 如果i不是4的倍数:W[i] = W[i-4] ⊕ W[i-1]
- 如果i是4的倍数:W[i] = W[i-4] ⊕ T(W[i-1])
其中T函数定义为:T(W) = SubWord(RotWord(W)) ⊕ Rcon[i/4]
4. 完整示例演示
假设初始密钥:2B 7E 15 16 28 AE D2 A6 AB F7 15 88 09 CF 4F 3C
第一轮扩展(i=4):
- W[3] = [09, CF, 4F, 3C]
- RotWord(W[3]) = [CF, 4F, 3C, 09]
- SubWord后:[8A, 84, EB, 01]
- ⊕ Rcon[1] = [8A⊕01, 84⊕00, EB⊕00, 01⊕00] = [8B, 84, EB, 01]
- W[4] = W[0] ⊕ T(W[3]) = [2B,7E,15,16] ⊕ [8B,84,EB,01] = [A0,FA,FE,17]
第二轮扩展(i=5):
- W[5] = W[1] ⊕ W[4] = [28,AE,D2,A6] ⊕ [A0,FA,FE,17] = [88,54,2C,B1]
继续此过程直到生成所有44个字。
5. 轮密钥提取
轮密钥按4个字一组提取:
- 轮密钥0:W[0]-W[3]
- 轮密钥1:W[4]-W[7]
- ...
- 轮密钥10:W[40]-W[43]
6. 不同密钥长度的差异
- AES-192:初始密钥192位,生成52个字,13个轮密钥
- AES-256:初始密钥256位,生成60个字,15个轮密钥
生成逻辑类似,但判断条件有所不同(AES-256中i mod 8 = 4时应用SubWord)
安全性考虑
密钥扩展算法设计确保了:
- 密钥相关性:每个轮密钥都与初始密钥相关
- 非线性性:通过S盒引入非线性
- 扩散性:轮常量确保不同轮的密钥有足够差异
这个密钥扩展过程为AES的每一轮加密提供了独立的轮密钥,是实现AES安全性的重要基础。