首页 理论教育 AES加密过程详解

AES加密过程详解

时间:2023-07-02 理论教育 版权反馈
【摘要】:但在AES中,将明文和密文长度固定为128bit,密钥长度可以使用128bit、192bit和256bit三者中的任意一种,明文及加密过程的中间结果都称为状态State,状态State被表示成矩阵,矩阵的每个元素是1字节,并看成是有限域GF中的一个元素,矩阵的行数为4,列数为Nb。加密算法框图如图4-12所示,框图左边为AES加密算法的整体结构,右边为加密算法中的一轮变换,当Nk等于4时,整个算法由10轮组成。

AES加密过程详解

Rijndael之所以能被选作高级加密标准,是因为该算法除具备低成本、高安全性的特性外,最大的优点在于即使在受限的工作环境下,如在较小的内存空间中,仍有很好的加密/解密运算效率,而且设计简单,对所有已知的攻击具有免疫性,如此便能保证AES有较长的安全周期。

1.AES的加密算法描述

在Rijndael的设计中,其算法的明文分组和密钥长度都有三个可选值,分别为128bit、192bit和256bit,产生的密文没有数据扩展。但在AES中,将明文和密文长度固定为128bit,密钥长度可以使用128bit、192bit和256bit三者中的任意一种,明文及加密过程的中间结果都称为状态State,状态State被表示成矩阵,矩阵的每个元素是1字节,并看成是有限域GF(28)中的一个元素,矩阵的行数为4,列数为Nb。密钥被表示成4行Nk列的矩阵,Nk等于密钥长度比特数除以32,加密的轮数用Nr表示,如表4-10所示。

表4-10 Nr与NbNk的关系

978-7-111-37285-1-Chapter04-53.jpg

注:Nb=分组长度(bit)/32(bit);Nk=密钥长度(bit)/32(bit);Nr=加密的轮数

AES的加密算法没有采用Feistel结构,使用SP结构在每一轮使用代换和混淆并行处理整个数据分组。加密算法框图如图4-12所示,框图左边为AES加密算法的整体结构,右边为加密算法中的一轮变换,当Nk等于4时,整个算法由10轮组成。每轮由4个变换模块组成,分别是:字节代换(ByteSub)、行移位(ShiftRow)、列混合(MixColumn)、密钥加(AddRoundKey),最后一轮略有不同,没有列混合。

加密过程描述如下:

1)初始轮密钥加。给定一个明文M和种子密钥K0,将它们以矩阵排列并进行异或加法运算。

2)Nr-1轮迭代。对前Nr-1轮中的每一轮,用S盒进行一次字节代换操作(ByteS-ub);对代换的结果做行移位操作(ShiftRow);接着做列混合变换(MixColumn);再进行密钥加(AddRoundKey)操作。轮迭代中的密钥Ki由种子密钥K0通过密钥扩展算法产生。

3)最后一轮变换。最后一轮变换与前面各轮稍有不同,依次进行ByteSub、ShiftRow和AddRoundKey操作。

978-7-111-37285-1-Chapter04-54.jpg

图4-12 AES加密算法框图

a)AES算法的整体结构 b)AES算法的一轮变换

2.加密轮变换

AES的加密轮变换主要由4个不同的变换模块组成,用伪C语言描述如下:

978-7-111-37285-1-Chapter04-55.jpg

最后一轮变换与前面各轮不同,将MixColumn这一步去掉,其伪C语言代码如下:

978-7-111-37285-1-Chapter04-56.jpg

(1)字节代换(ByteSub)

字节代换ByteSub(State)是一个关于字节的非线性变换,可以使用S盒查表得到输出。AES定义了一个S盒,如表4-11所示,它是由16×16字节组成的方形表,包含了8位值所能表示的256种可能的变换。对于已知的某字节作为S盒的输入,把该字节的高4位作为行号,低4位作为列号,查表4-11取出S盒中对应行列交叉点的元素作为输出。例如,S(8C)=64,S(B3)=6D。

Nk等于4时,AES中的State是一个4行4列的矩阵,字节代换是一个简单的S盒查表操作,如图4-13所示。

978-7-111-37285-1-Chapter04-57.jpg

图4-13 S盒字节代换

【例4-13】 设当前的State为978-7-111-37285-1-Chapter04-58.jpg,计算ByteSub(State)。

查表4-11知S(51)=D1,S(67)=85,依此类推,所有字节查表完成可得978-7-111-37285-1-Chapter04-59.jpg

S盒是可逆的,由以下两个变换的合成得到:

首先,将字节X看做GF(28)上的元素,变换成自己的乘法逆元T

TX-1mod(x8+x4+x3+x+1)

其次,对字节T作GF(2)上的仿射变换

Y=A·TB

AES用矩阵以如下的方式来描述这个仿射变换:

978-7-111-37285-1-Chapter04-60.jpg

其中, 978-7-111-37285-1-Chapter04-61.jpg978-7-111-37285-1-Chapter04-62.jpg

从而SX)=A·X-1B

表4-11 AES加密算法的S盒

978-7-111-37285-1-Chapter04-63.jpg

(2)行移位(ShiftRow)

在行移位变换中,状态矩阵State中的每一行将以字节为单位,循环左移不同的位移量。图4-14描述行移位变换方法,State的第一行保持不变,第二行循环左移1字节,第三行循环左移2字节,第四行循环左移3字节。

978-7-111-37285-1-Chapter04-64.jpg

图4-14 行移位变换方法

【例4-14】 设当前的State为978-7-111-37285-1-Chapter04-65.jpg,计算ShiftRow(State)。

按图4-14所示的行移位变换方法可得

978-7-111-37285-1-Chapter04-66.jpg

(3)列混合(MixColumn)(www.xing528.com)

列混合变换将State乘以一个固定的矩阵A,对State逐列进行变换,每一列中的每个字节被变换成一个新值,直到4列都变换完毕。相乘后得到的乘积矩阵,其中每个元素均是一行和一列中所对应元素的乘积之和。这里的乘法和加法都是定义在有限域GF(28)上的。

978-7-111-37285-1-Chapter04-67.jpg

【例4-15】 设当前的State为978-7-111-37285-1-Chapter04-68.jpg,计算MixColumn(State)。

978-7-111-37285-1-Chapter04-69.jpg

对于乘积结果矩阵中的第一列,计算如下:

978-7-111-37285-1-Chapter04-70.jpg

第一列中的第一个字节9D通过如下方式计算而得

978-7-111-37285-1-Chapter04-71.jpg

在AES中,列混合变换也可以用数学上的多项式来计算。MixColumns(State)对一个状态逐列进行变换,它将一个状态的每一列视为有限域GF(28)上的一个多项式。

在列混合变换中,每一列所表示的多项式将乘以一个固定的多项式Ax),模多项式为(x4+1),多项式Ax)定义如下

Ax)={03}x3+{01}x2+{01}x+{02}

(4)密钥加(AddRoundKey)

密钥加是将轮密钥Ki简单地与状态State进行逐比特异或。轮密钥Ki由种子密钥K0通过密钥扩展算法得到,将状态State表示为矩阵Ai-1,与轮密钥Ki的密钥加运算为

978-7-111-37285-1-Chapter04-72.jpg

【例4-16】 列混合后的结果Ai-1与轮密钥Ki分别为

978-7-111-37285-1-Chapter04-73.jpg

求轮密钥加后的结果Ci

978-7-111-37285-1-Chapter04-74.jpg

3.密钥扩展算法

密钥扩展算法可将种子密钥K0通过一定的运算得到整个加密过程中所有的轮密钥,原理如下:

●种子密钥通过密钥扩展算法被扩展成扩展密钥;

●轮密钥从扩展密钥中取,其中第1轮轮密钥取扩展密钥的前Nb个字,第2轮轮密钥取接下来的Nb个字,如此下去;

●轮密钥的比特数总和等于分组长度乘以轮数加1,如分组长度为128bit,轮数为10时,轮密钥的比特数总和为

128bit×(10+1)=1408bit

用伪C语言描述Nk≤6的密钥扩展算法如下

978-7-111-37285-1-Chapter04-75.jpg

以上算法中,由密钥扩展算法将种子密钥扩展成扩展密钥的计算过程如下:

978-7-111-37285-1-Chapter04-76.jpg

当种子密钥长度为128bit时,这里的Nk=4,其中,

temp=SubByte(RotByte(W[i-1]))⊕Rcon[i]

RotByte()表示循环左移1字节,如W=(a0a1a2a3),则RotByte(W)=(a1a2a3a0);

SubByte()是S盒的字节代换;

Rcon[i]为轮常数,定义为

978-7-111-37285-1-Chapter04-77.jpg

字节用十六进制表示,同时为GF(28)上的元素,其中xi-1为GF(28)域中的多项式xi-1次方所对应的字节。由于x对应的字节为02,上式也可以写为

Rcon[i]=((02)i-1,00,00,00)

【例4-17】 在AES加密算法中,假定种子密钥K0的长度为128bit,它的值为

K0=06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 02 03 04 05

计算第1轮的子密钥K1的值。

978-7-111-37285-1-Chapter04-78.jpg

其中,

978-7-111-37285-1-Chapter04-79.jpg

根据密钥扩展算法可计算出:

978-7-111-37285-1-Chapter04-80.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈