高级加密标准(AES)简介

1.简介

DES的56位**在穷举**搜索的攻势下显得不太安全,64位块也不够强大,急需一个新算法。美国*想把已经广泛使用的加密算法标准化,称为高级加密标准(Advanced Encrypted Standard,AES),经过多次讨论,最终采用了Rijndael算法(AES候选算法之一)。
AES采用128位块和128位**。AES的主要特性如下:
 对称与并行结构:是算法实现具有很大的灵活性,而且能够很好地抵抗密码分析攻击。
 适应现代处理器:算法很适合现代处理器,如:Pentium、RISC、并行处理器等。
 适合智能卡。
Rijndael支持的**长度和明文块长度为128位~256位(步长为32位)。**长度与明文长度要分别选取。AES规定,明文块长度必须是128位,**长度是128位、192位或256位。通常使用的两个AES版本是:128位明文块加128块**,以及128位明文块加256位**。
由于128位明文块加128位**更像是一个商用标准,因此只介绍这个版本。其他版本的原理是相同的。

2.操作

与DES的工作方法类似,Rijndael也使用了替换和变换的基本技术。**长度和明文块长度决定了需要运行的轮数。最少轮数为10(当**长度和明文块长度都为128位时),最多轮数是14。DES和Rijndael的一个主要不同之处是:所有的Rijndael操作都涉及整个字节,而不是字节的单个位。这使得可以更好的进行该算法实现的硬件和软件优化。Rijndael的步骤如下:
完成以下一些一次性初始化处理:
1.扩展16字节的**,以得到所用的实际的**块;
2.完成16字节明文块(称为状况)的一次性初始化;
3.该状况与**块进行XOR运算。
对每一轮,完成以下工作:
1.对每个明文块应用S盒;
2.把明文块的k行旋转k个字节;
3.执行一个混合列操作;
4.该状况与**块进行XOR运算。

3.一次性初始化操作

3.1 得到实际**块
与正常情况不一样,该算法的输入是**和明文。在这种情况下,**长度是16字节。这一步是要把这个16字节**扩展到11个数组中,每个数组含有4行4列。**扩展过程下图所示:
高级加密标准(AES)简介
换句话说,初始16字节的**被扩展为一个含有11×4×4=176字节的**。这11个数组中的一个用于初始化处理,其余10个数组用在10轮中,每轮一个数组。
AES上下文中的术语“词”,一个词意为4个字节,所以,16个字节的初始**(4个词)将扩展成为176个字节的**(44个词)。
(1)首先,把初始16字节的初始**复制到扩展**的前4个词中,如下图所示:
高级加密标准(AES)简介
另一种表示如下图所示:
高级加密标准(AES)简介
(2)如上填充了扩展**的第一个数组(标号为W0~ W3)后,逐个填充剩余的10个数组(标号为W4~W43)。每次填充一个4×4的数组,即4个词。添加每个**数组块与上一个块以及位于该块之前的第4个块有关,也就是说,添加的每个词的W[i]与W [i-1]和W [i-4]有关,其逻辑如下:
(a)在W数组中,如果索引是4的倍数的词,就需要使用一些复杂的逻辑,即对于W[4],W[8],W[12],⋯,W[40],其填充逻辑如下图所示:
高级加密标准(AES)简介
(b)对于其他的词,只需要简单的XOR运算即可。
在图3-4中,第一for循环,用来将输入**块复制到输出**块的前四个词中。在第二个for循环中,将检查当前词的索引是否为4的倍数。如果是,则执行3个函数Substitute、Rotate和Constant。如果不是,则只需要把前面第一个词和前面第四个词进行XOR运算。
函数Substitute对输入词的每个字节进行字节替换。为此使用了下表所示的S盒:
高级加密标准(AES)简介
函数Rotate把词的内容完成一个左移位循环,每次移动一个字节。这样,如果输入词中含有标号为[B1 B2 B3 B4]的四个字节,那么输出词将含有四个字节为[B2 B3 B4 B1]。
在函数Constant中,以上步骤的输出与一个常量进行XOR运算。该常量是一个词,由4个字节组成的。该常量的值与轮数有关,常量词的后三个字节总为0。这样,与这样的一个常量进行XOR运算的输入词总是与输入词的第一个字节进行XOR运算一样,每轮的常量值如下表所示:
高级加密标准(AES)简介
3.2 明文块的一次性初始化
这里把16字节的明文块复制到一个称为state的二维4×4数组中,复制顺序是按列进行,也就是,该明文块的前4个字节复制到state数组的第一列中,接下来的4个字节复制到state数组的第二列中,一次类推,复制顺序如下图所示:
高级加密标准(AES)简介
3.3 密文块与state数组进行XOR运算
现在扩展**的前16字节(即4个词W[0],W[1],W[2]和W[3])进行XOR运算后存储到16字节的state数组(即图3-5所示的B1~B16)。于是,state数组中的每个字节被其自己扩展**的对应字节做XOR运算后的结果替换。

4.每轮的操作

对于每一轮,运行下面步骤10次。
4.1 对每个明文字节应用S盒
这一步很简单,按state数组的内容查找S盒(对应于表3-1)。用S盒的对应项替换state数组的内容,从而完成逐个字节的替换。
4.2 把明文块的k行旋转k个字节
State数组(有4行)的每一行都向左旋转,行0旋转0个字节(即不旋转),行1旋转1个字节,行2旋转2个字节,行3旋转3个字节。这有助于数据的混淆。其旋转后的数组表示如下表所示:
高级加密标准(AES)简介
4.3 进行混合列操作
现在进行混合列操作,且相互之间是没有关联的,这需要使用到矩阵相乘操作。这一步输出是旧值与常量矩阵进行矩阵相乘的结果。
state数组组织成了一个4×4的矩阵,矩阵相乘是一次一列(即一次4个字节)进行的。列的每个值要与矩阵的每个值相乘(即总共进行16次乘法),这些相乘的结果一起进行XOR运算,只生成4个字节,用作下一个state数组。这种乘法是每次用矩阵的一行乘以state列的每个值。
这里总共有4个输入、16次乘法、12次XOR运算以及4个输出字节。
4.4 把state数组与**块进行XOR运算
这一步是把该轮的**与state数组进行XOR运算。
对于解密,其执行过程正好相反。