什么是AES算法?
1997年1月2日,美国国家标准和技术研究院(National Institute of Standard and Technology,NIST)宣布征集一个新的对称密钥分组密码算法作为新的加密标准,以取代即将过期的DES。新的算法被命名为高级加密标准(Advanced)。1997年9月12日发布了征集算法的正式公告,要求AES具有128位分组长度,支持128、192和256位的密钥长度。比三重DES有效,至少要与三重DES一样安全,而且要求AES能在全世界范围内免费得到。
1998年8月20日,NIST宣布接受15个算法为AES的候选算法,并提交全世界的密码学界协助分析这些算法。1999年8月,确定了5个候选决赛算法,分别是MARS、RC6、Rijndael、Serpent和Twofish。经过对决赛算法的进一步分析,2000年10月NIST决定将Rijndael作为AES,并于2002年5月26日制定了AES的规范。
Rijndael是由比利时的两位密码学家Daemen和Rijment共同设计的。Rijndael算法是一个迭代型分组密码,其分组长度和密钥长度都可变,各自可以为128比特、192比特和256比特。Rijndael对明文以字节为单位进行处理。以128位的分组、128位密钥的情况为例,首先将明文按字节分成列组,将明文的前4个字节组成一列,接下来的4个字节组成第二列,后面的字节依次组成第三列和第四列,这样就组成了一个4×4的矩阵,如图所示。
这样AES输入的16个字节排成了一个二维数组,称之为状态矩阵。AES的加密和解密变换都是基于状态数组来处理的,在中间结果上的不同变换操作称为状态。AES的状态矩阵的列数Nb等于分组的长度除以32,矩阵中的每个元素是一个8位字节。
同样,密钥也可以表示成一个4×Nk的矩阵,Nk等于密钥的长度除以32,当密钥的长度为128位时N=4,如图所示。
为表述简单,我们只讨论密钥长度为128比特、分组长度为128比特时的情形,对于其他分组长度和密钥长度的类型,AES的工作原理是相同的。
AES的基本变换单位是“轮”,加解密过程是由轮变换多次迭代而成。当分组长度和密钥长度均为128比特时,轮数为Nr=10。我们将AES中的轮变换记为Round(State, RoundKey),State表示消息的状态矩阵;RoundKey表示轮密钥矩阵,一轮的完成将改变State矩阵中的元素,称之为改变它的状态。对于加密来说,输入到第一轮中的State就是明文消息矩阵,最后一轮输出的State就是对应的密文消息矩阵。
AES的(除最后一轮外)轮变换由四个不同的变换组成,这些变换我们称之为内部轮函数,AES的轮可表示成如下形式:
Round(State, RoundKey){
SubBytes(State);
ShiftRows(State);
MixColumns(State);
AddRoundKey(State, RoundKey);}
其中,ByteSub(State)称为字节代替变换、ShiftRow(State)称为行移位变换、MixColumns(State)称为列混合变换,以及AddRoundKey(State, RoundKey)称为与子密钥异或。
最后一轮略微不同,将其记作FinalRoundKey(State, RoundKey),相当于前面的Round(State, RoundKey)去掉MixColumns(State)。
AES的算法执行过程如图下图所示,步骤如下:
- 给定明文M,将State初始化为M,并进行AddRoundKey(State, RoundKey),将RoundKey与State进行异或运算。
- 对于前Nr–1轮中的每一轮,分别执行Round(State, RoundKey)过程。
- 执行最后一轮FinalRoundKey(State, RoundKey)过程,即只执行SubBytes(State)、ShiftRows(State)、AddRoundKey(State, RoundKey)三个操作。
前面已知,AES的轮函数分4层(或称为内部轮函数):ByteSub(State)字节代替变换、ShiftRows(State)行移位变换、MixColumns(State)列混合变换以及AddRoundKey(State, RoundKey)与子密钥异或。
这样就完成了AES算法。(本文为原创,转载需向我请求权限,谢谢~)