2001年NIST发布了高级加密标准(AES),旨在取代DES成为广泛使用的标准。我们以简化版的AES作为学习对象,来理解AES。
AES加密过程如图所示,明文分组的长度为128位,密钥长度为128位(或者192位,256位),根据密钥长度,AES算法称为AES-128、AES-192或者AES-256。根据密钥长度不同,加密轮数也不一样。
加密和解密算法的输入都是128位分组,在FIPS PUB 197中,将该分组化为4x4的字节方阵。分组从输入到复制到state数组,再到输出结果的过程如图所示。根据轮数的多少,state数组变换就有多少个。
密钥也用4x4方阵描述,以128位密钥扩展为例,每个字是4个字节,128位的密钥最终扩展为44个字的序列,如图所示。
加密算法的128位明文分组输入的前4个字节按顺序放在in矩阵的第一列,接着的4个字节放在第二列,依次下去。扩展密钥的前4个字节放在w矩阵的第一列。密钥扩展与轮数的关系如表所示。
下面来看AES加解密的具体实现过程。
详细结构
AES密码加解密的详细过程如图所示。
AES的总体结构
- AES结构不是Feistel结构,AES算法没有使用Feistel结构,在每一轮中都使用代替和混淆将整个数据分组作为一个单一的矩阵处理。
- 输入的密钥被扩展成由44个32位字所组成的数组w,每轮有4个不同的字作为该轮的轮密钥。
- 有四个不同阶段组成:字节代替,行移位,列混淆,轮密钥加。
- 算法结构非常简单。一轮加密过程如图所示。
- 仅仅在轮密钥加阶段使用密钥。该算法以轮密钥加开始,以轮密钥加结束。
- 轮密钥加实质上是一种Vernam密码形式,就其本身是不难破译的。
- 每个阶段是可逆的。
- 将所有的四个阶段求逆,很容易证明解密函数可以恢复明文。
- 加密和解密过程的最后一轮均只包含三个阶段。
下面具体讨论AES中变换函数的四个阶段。
字节代替变换
字节变换有:正向字节变换,逆向字节变换。字节变换如图所示。
正向字节变换是一个简单的查表操作,其中S盒定义如下。
逆向字节变换的S盒定义如下。
正因为S盒是可逆的,所以才能解密。
行移位变换
正向行移位变换如图所示,第一行保存不变,第二行循环左移一个字节,第三行循环左移两个字节,第四行循环左移三个字节。
逆向行移位变换,后三行执行相反的移位操作。
列混淆变换
正向列混淆变换对每列独立操作,每列中的每个字节被映射为一个新值,这个值由该列中的4个字节通过函数变换得到。列混淆如图所示,这是一个乘积矩阵运算。
即为
与之对应的逆向列混淆如下
即满足
也就是
轮密钥加变换
轮密钥加变换如图所示,可以看做state的一列中的4个字节与轮密钥的一个字进行列间操作。第一个矩阵方阵表示state,第二方阵表示轮密钥。
逆向轮密钥加变换和正向变换一样,异或操作是其本身的逆。
轮密钥加变换虽然简单,但是能够影响state中的每一个位。