AES 128位,192位,256位

3
我已成功地使用128位密钥编写了自己的AES实现。然而,我仍然不知道如何使用192位和256位密钥来解释AddRoundKey函数。
以下是一些事实:
- 块大小为128位(状态) - 轮数:128位=10轮,192位=12轮,256位=14轮 - Nk:128位=4(与块大小相等),192位=6,256位=8(单位为字)
如果Nk = 8且i-4是Nk的倍数,则在XOR之前将SubWord()应用于w[i-1]。
有人知道如何应用192位和256位密钥吗?感谢任何回复。
1个回答

3

我认为你有点混淆了。来自FIPS-197:

在AddRoundKey()变换中,通过简单的按位异或操作将一个轮密钥添加到状态中。每个轮密钥由密钥计划中的Nb个字组成。

因此,AddRoundKey()函数使用密钥计划中相应的字对状态进行异或运算。现在再次来自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。因为 i%Nk==0,所以 i/Nk 将是一个整数。
然后,让你感到困惑的部分是:如果Nk > 6,也就是说,如果我们使用256位密钥,并且 i mod Nk == 4,即 (q*Nk)+4i,其中 q 是某个数量,则需要进行预先-xor Subword。
最后,无论发生什么事情,先前单词的内容仍会与 temp 进行 xor
密钥表中的区别在于使用了256位密钥。
如果有帮助的话,正确的方法是使用FIPS-197或NIST AES软件包中提供的测试向量来检查。在所有位级别上都有密钥调度的测试向量;试一下,它们会告诉你何时出错。
  1. FIPS-197
  2. AES有用的解释。你可能已经掌握了大部分内容,但这是一个很好的指南。从维基百科无耻地借鉴过来,

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接