AES(Advanced Encryption Standard)是取代前任标准(DES)而成为新标准的一种对称密码算法。

2000年,在多个对称密码候选算法中,选出了一种名为Rijndael的对称密码算法,并将其确定为了AES。

AES的选拔

组织AES公开竞选的是美国的标准化机构NTST(National Institute of Standards and Technology, 国家标准技术研究所),该机构所选拔的密码算法,将成为美国的国家标准,即联邦信息处理标准(FIPS)。

参加AES竞选的条件:

  1. 被选为AES的密码算法必须无条件地免费供全世界使用。
  2. 参加者必须提交密码算法的详细规格书、以ANSI C和Java编写的实现代码以及抗密码破译强度的评估材料。

AES的选拔过程是对全世界公开的。

1997年,NTST开始公开募集AES,进入评审对象范围的密码算法共有15个(CAST-256、Crypton、DEAL、DFC、E2、Frog、HPC、LOK197、Magenta、MARS、RC6、Rijndael、SAFER+、Serpent、Twofish)。

AES的选拔并不仅仅考虑一种算法是否存在弱点、算法的速度、实现的容易性等也都在考虑范围内。不仅加密本身的速度要快、密钥准备的速度也很重要。

这种算法还必须能够在各种平台上有效工作,包括智能卡、8为CPU等低性能平台以及工作站等高性能平台。

2000年10月2日,Rijndael力压群雄,被NTST选定为AES标准。

Rijndael

Rijndael是由比利时密码学家Joan Daemen和Vincent Rijmen设计的分组密码算法。

Rijndael的分组长度和密码长度可以分别以32比特为单位在128比特到256比特的范围内进行选择。AES规格中,分组长度固定为128比特,密码长度只有128、192以及256比特三种可选。

Rijndael的加解密

Rijndael算法也是由多个轮构成的,其中每一轮分为SubBytes、ShiftRows、MixColumns和AddRoundKey共4个步骤。

DES使用Feistel网络作为基本结构,而Rijndael没有使用Feistel网络,而是使用SPN结构。

Rijndael的输入分组为128比特,也就是16个字节。

SubBytes

以字节的值(0~255)为索引,从一张拥有256个值的替换表(S-Box)中查找出对应值的处理。 也就是将1个字节的值替换为S-Box中对应索引的另一个1字节的值。

S-Box替换表AES官方会提供,也可以自己手动设置。

ShiftRows

以4字节为单位的行(row)按照一定的规则向左平移,且每一行平移的字节数是不同的。

MixColumns

对4字节的值进行比特运算,将其变为另外一个4字节的值。

AddRoundKey

将上面的结果与轮密钥进行XOR。

结论

通过上面的结构,可以发现输入的所有比特在一轮中都会被加密。

和每一轮只加密一半输入的比特的Feistel网络相比,这种方式的优势在于加密所需要的轮数更少。

这种方式的另一个优势在于,SubBytes、ShiftRows和MixColumns可以分别以字节、行和列为单位进行并行计算。

加密流程

SubBytes->ShiftRows->MixColumns->AddRoundKey

解密流程

AddRoundKey->InvMixColumns->InvShiftRows->InvSubBytes

Inv指的是加密流程中对应步骤的逆运算。