我成功地使用128位密钥编写了自己的AES实现。但是,我仍然想知道如何使用192位和256位密钥来解释AddRoundKey函数。
一些事实:
如果Nk = 8且i-4是Nk的倍数, 然后将SubWord()应用于w [i-1] 在异或之前。
有谁知道如何应用192位和256位密钥?任何回复都表示赞赏。
答案 0 :(得分:3)
我觉得你有些困惑。来自FIPS-197:
在AddRoundKey()转换中,Round Key通过简单的按位添加到State 异或操作。每个Round Key由关键时间表中的Nb个单词组成
因此AddRoundKey()函数xor是具有密钥调度中相应单词的状态。现在再次来自FIPS-197:
KeyExpansion(byte key[4*Nk], word w[Nb*(Nr+1)], Nk)
begin
word temp
i = 0
while (i < Nk) # copy key to first Nk bytes of key sched. w is the key sched.
w[i] = word(key[4*i], key[4*i+1], key[4*i+2], key[4*i+3])
i = i+1
end while
i = Nk
while (i < Nb * (Nr+1)] # for remaining key schedule size
temp = w[i-1] # get previous word
if (i mod Nk = 0) # if i is a multiple of Nk a.k.a. every key length
temp = SubWord(RotWord(temp)) xor Rcon[i/Nk]
else if (Nk > 6 and i mod Nk = 4) # this for 256-bit keys only
temp = SubWord(temp)
end if
w[i] = w[i-Nk] xor temp # the xor operation
i = i + 1 # if you've used a for loop, ignore this.
end while
这实际上相当简单。关键时间表的第一个NK
字是关键。从那时起,您使用前一个单词按xor
创建每个单词,除非此特定单词是Nk
的精确倍数,在这种情况下,您应用FIPS-197中描述的Subword函数输出旋转的单词xor'd由该特定回合的圆常数(i / Nk将是一个整数,因为i%Nk == 0)。
然后,你感到困惑的是:如果Nk > 6
,那么如果我们使用的是256位密钥,那么i mod Nk == 4
即(q*Nk)+4
是i
一些q,然后你做你的pre-xor Subword。
最后,无论发生什么事情,先前,前一个单词的内容仍然与临时相关。
密钥计划的差异在于256位密钥。
如果有帮助,了解您做得正确的方法是使用FIPS-197或NIST AES软件包中提供的测试向量。在所有比特级都有关键时间表的测试向量;给他们一个机会,他们会在你出错的时候告诉你。