AES 128bit,192bit,256bit

时间:2011-02-20 22:01:22

标签: c++ aes

我成功地使用128位密钥编写了自己的AES实现。但是,我仍然想知道如何使用192位和256位密钥来解释AddRoundKey函数。

一些事实:

  • 块是128位(状态)
  • 轮次128位= 10,192位= 12,256位= 14
  • Nk 128bit = 4(等于块大小),192bit = 6,256bit = 8(单位为单词)
  

如果Nk = 8且i-4是Nk的倍数,   然后将SubWord()应用于w [i-1]   在异或之前。

有谁知道如何应用192位和256位密钥?任何回复都表示赞赏。

1 个答案:

答案 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)+4i一些q,然后你做你的pre-xor Subword。

最后,无论发生什么事情,先前,前一个单词的内容仍然与临时相关。

密钥计划的差异在于256位密钥。

如果有帮助,了解您做得正确的方法是使用FIPS-197或NIST AES软件包中提供的测试向量。在所有比特级都有关键时间表的测试向量;给他们一个机会,他们会在你出错的时候告诉你。

  1. FIPS-197
  2. Useful explanation of AES。你可能已经完成了大部分工作,但它是一个很好的指南。从维基百科无耻地窃取,