AES加密算法的密钥扩展算法
题目描述:
AES加密算法使用128位、192位或256位的初始密钥,需要生成11轮、13轮或15轮的轮密钥(每轮128位)。密钥扩展算法负责将初始密钥扩展成多个轮密钥,供加密过程中的各轮使用。请详细讲解AES-128(128位密钥版本)的密钥扩展过程。
解题过程:
-
基本概念理解
AES-128需要生成11个轮密钥(第0轮到第10轮),每个轮密钥128位(16字节)。初始密钥为128位,需要扩展成176字节(11×16)的扩展密钥。 -
密钥扩展流程
密钥扩展通过递归方式生成,每4字节(32位)为一组:
- 前4组(16字节)直接使用初始密钥
- 后续每组通过前一组和4组前的组计算得出
- 每4组为一个循环,需要特殊处理
- 具体步骤分解
步骤1:初始填充
将初始密钥分为16字节:K[0]到K[15]
前4组轮密钥就是初始密钥:
W[0] = K[0]K[1]K[2]K[3]
W[1] = K[4]K[5]K[6]K[7]
W[2] = K[8]K[9]K[10]K[11]
W[3] = K[12]K[13]K[14]K[15]
步骤2:递归生成规则
对于i ≥ 4:
如果i不是4的倍数:W[i] = W[i-4] ⊕ W[i-1]
如果i是4的倍数:W[i] = W[i-4] ⊕ T(W[i-1])
- T函数详解
T函数包含三个操作:
子操作1:循环左移(RotWord)
将4字节向量[a,b,c,d]循环左移为[b,c,d,a]
子操作2:字节替换(SubWord)
使用AES的S盒对每个字节进行非线性替换
子操作3:轮常量异或(Rcon)
与轮常量Rcon[i/4]进行异或,轮常量计算:
Rcon[j] = (RC[j], 0x00, 0x00, 0x00)
RC[1] = 0x01
RC[j] = 0x02 × RC[j-1](在GF(2^8)中)
- 完整计算示例
以第4组W[4]为例:
W[4] = W[0] ⊕ T(W[3])
T(W[3])计算:
- 假设W[3] = [a,b,c,d]
- 循环左移:RotWord(W[3]) = [b,c,d,a]
- 字节替换:SubWord([b,c,d,a])
- 异或轮常量:⊕ Rcon[1] = [0x01,0x00,0x00,0x00]
- 密钥扩展完成
重复上述过程直到生成44个32位字(176字节),对应11个轮密钥。每个轮密钥由连续的4个字组成,如轮密钥0:W[0]W[1]W[2]W[3],轮密钥1:W[4]W[5]W[6]W[7],依此类推。
这个密钥扩展过程确保了轮密钥之间的非线性关系,增强了算法的安全性。