一、 AES的出现
尽管3DES能够抵抗利用当前技术发起的蛮力攻击,但它仍然存在一些问题,首先3DES的软件实现并不十分高效,DES已经不适合软件实现,而3DES实现所需要的时间是DES的三倍多。DES的第二个缺点是它的分组大小相对较小,一般每个分组是64bits,这也是一个非常大的缺陷,如果使用量子计算机攻击DES,密钥长度最好接近256bits。因此,NIST得出一个结论:需要一个全新的分组密码来代替DES。1997年4月15日,美国ANSI发起征集AES(advanced encryption standard)的活动,在一开始征集AES时,有四个要求:
1、 该密码必须是分组密码且分组大小为128位;
2、 必须支持三种密码长度:128位,192位,256位。
3、 比提交的其他算法更安全
4、 在软件和硬件实现上都很高效。
经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。Rijndael由比利时的Joan Daemen和Vincent Rijmen设计。算法的原型是Square算法,它的设计策略是宽轨迹策略(wide trail strategy)。算法有很好的抵抗差分密码分析及线性密码分析的能力。AES过程也为分组密码的设计、分析和应用提供了巨大的推动力。除非AES中存在灾难性的弱点,否则这种密码将在未来20到30年几乎在所有地方使用。
二、 AES描述
AES采用的是SP网络(代换-置换网络,而非Feistel架构),该密码的分组长度是128bits,加密密钥有128,192,256bits三种,AES采用的是byte结构,将明文分组放在一个4
×
\times
× 4的矩阵中(每个项代表一个byte(8bits)),在学习AES加密过程之前,需要掌握关于GF(
2
n
2^n
2n)的计算(加法和乘法),这对之后学习S盒非常重要。有限域:函数的运算结果全部包含在一个域中,这个域不同于实数域,有限域有一个最大值,超过最大值的数都会经过一定的方法是的这个数回到这个域中。
三、 AES的加密过程
AES被定义为分组长度为128bits,密钥长度为128,192,256bits,根据密钥长度不同,将AES记为AES-128,AES-192和AES-256,他们三个的区别在于加密的轮数和密钥编排方面。AES-128需经历10轮,AES-192需经历12轮,AES-256需经历14轮,下面我们以AES-128为例。
128-bit的输入被写为
b
0
b
1
⋯
b
7
b_{0}b_{1} \cdots b_{7}
b0b1⋯b7 ,这128bits可以写为16byte(每byte代表8bits)
B
0
B
1
⋯
B
7
B_{0}B_{1} \cdots B_{7}
B0B1⋯B7,每个
B
i
B_{i}
Bi可以表示为
b
8
i
b
8
i
+
1
⋯
b
8
i
+
7
b_{8i}b_{8i+1} \cdots b_{8i+7}
b8ib8i+1⋯b8i+7,每个byte都可以用GF(
2
n
2^n
2n)的元素表示成一个度为7的多项式:
因此,将128bits的输入写为一个矩阵的形式:
AES一共分为以下几个操作:SubBytes(S盒)—每个byte经过一个非线性计算,ShiftRows(行移位)—矩阵的每行右移的字节数不同,MixColums(列混合)—乘一个矩阵M,Addkey(密钥加)—与子密钥矩阵进行异或运算。AES加密的整个过程:
下面分开介绍:
1、 SubBytes
字节变换使用一个S盒,S盒是一个16
×
\times
× 16的矩阵,如下表,其非线性置换为:输入的前四位指定S盒的行,后四位制定S盒的列,例如“03”,行0,列3,因此输入为“03“,输出为“7B”。
n
i
=
S
[
m
i
]
,
1
≤
i
≤
15
n^{i}=S[m_{i}],1\leq i\leq 15
ni=S[mi],1≤i≤15
2、 ShiftRows
矩阵第一行不动,第二行左移一位,第三行左移两位,第四行左移三位。
3、 MixColumns
将状态矩阵的每一列看作一个在GF(
2
8
2^8
28)的(4
×
\times
× 1)的列向量,将一个(4
×
\times
× 4)在GF(
2
8
2^8
28)上的矩阵M与列向量相乘(用到不可约多项式)。
4、AddRoundKey
将列混合的状态矩阵与子密钥进行XOR逻辑运算(子密钥是通过初始密钥经过密钥编排派生出来的),即将轮密钥与状态矩阵按比特异或,如下图:
5、 AES加密的整个过程
AES在加密之前,首先与子密钥进行密钥加运算,然后进行(n-1)轮的SubBytes、ShiftRows、MixColumns、AddRoundKey,最后一轮有SubBytes、ShiftRows、AddRoundKey变换。
6、 AES密钥编排
AES算法加密盒解密的过程中采用的密钥同样是以矩阵的形式,以字节为基本单位,AES-128, AES-192, 和AES-256是16,24,32 bytes,,对应的矩阵是:(4
×
\times
× 4)、(4
×
\times
× 6)、(4
×
\times
× 8),需要的扩展密钥分别是(16
×
\times
× 11)、(16
×
\times
× 13)、(16
×
\times
× 15)bytes,AES的密钥编排是面向单词的,也就是将4byte看作一个单词,如下图分别是AES-128, AES-192, 和AES-256的密钥编排流程图以及AESS加密的流程图:
7、AES中S盒的设计特点
AES与DES的不同点在于,DES的S盒给攻击者提供了破解DES的可能,而AES可以很好的抵御差分攻击和线性攻击,AES的S盒的设计如下图:
第一步:对每个byte求逆,利用多项式,GF(
2
8
2^8
28)中的逆元用作字节代换层核心功能的优势在于,它提供了高度的非线性,能防御一些目前已知的最强的分析攻击;
第二步:乘以一个矩阵L,在这里将状态矩阵的每个byte看作一个列向量,注意:列向量的第一个位置的数在表示回byte时应放在最右边的位置,L表示为:
第三步:加上一个常量位矩阵c,常数值就是01100011=
6
3
x
63_{x}
63x,在进行矩阵运算时,注意位置。
8、AES的扩散层
AES 的扩散层是由两个子层组成的:ShiftRow(行移位)和MixColumn(列混合),扩散指的是将单个位的影响扩散到整个状态中(明文中的每一位影响密文中的许多位),与非线性的S盒不同,扩散层对状态矩阵执行的是线性操作即DIFF(A)+DIFF(B)=DIFF(A+B)。ShiftRow保证了状态矩阵的同一列元素的关系被打乱,它的目的是增加AES的扩散属性。MixColumn也是一个线性变换,它混淆了状态矩阵的每一列,每个输入字节经过MixColumn变换都影响了四个输出字节,因此,MixColumn是AES的主要扩散元素,当输入中有两个byte不为0,那么输出至少有三个字节不为0,下面详细介绍一下矩阵M的特点。
矩阵M:最大距离可分码(Maximal Distance Separable, MDS)是线性码中较为重要的一类纠错码。设 M 是域 F 上的
n
×
n
n\times n
n×n矩阵,若M 的差分分支数和线性分支数均达 到 n+1,则称矩阵M 为一个极大最小距离可分矩阵 (简 称 MDS 矩阵)。与扩散结构的其他设计方法相比,采用MDS矩阵设计的扩散结构可以最大限度地保证分组 密码模型在差分和线性意义下的安全性,因此MDS 矩 阵是设计扩散结构的一类重要方法,AES中采用的矩阵M是MDS矩阵,并且也是循环矩阵、Hadamard矩阵,AES使用的MDS矩阵是从MDS码中提取出来的。
四、AES解密的过程
在上一次小组讨论时我们知道DES解密和加密一样,只是使用的解密密钥是倒置的加密密钥,这是因为DES使用的是Feistel结构,但是AES采用的是SPN结构,解密应该将所有的层倒过来,即字节代换层变为逆向代换层,ShiftRow层变为逆向ShiftRow层,MixColumn层变为逆向MixColumn层,而且子密钥的顺序也颠倒了,需要一个逆向的密钥编排,下图是AES解密的流程图:
1、逆向MixColumn层
在密钥加之后,再对状态矩阵使用逆向MixColumn操作(解密的第一轮除外),逆向MixColumn操作必须使用M矩阵的逆矩阵,输入时状态C(密文)的一个4字节长的列,状态C会与
M
−
1
M^{-1}
M−1相乘,系数的乘法和加法(按位或)都是在GF(
2
8
2^8
28)中完成的,下图是矩阵M的逆矩阵:
2、逆向ShiftRow层
为了逆转加密算法中的ShiftRow操作,我们必须反向移动状态矩阵中的行,第一行仍不变,第二行向左移三个字节,第三行向左移两个字节,第四行向左移一个字节。
3、逆向S盒操作
在解密密文时会用到逆向S盒,AES的S盒是双向映射,即一对一映射,因此满足下列公式是可能的:
A
i
=
S
−
1
(
B
i
)
=
S
−
1
(
S
(
A
i
)
)
A_{i}=S^{-1}(B_{i})=S^{-1}(S(A_{i}))
Ai=S−1(Bi)=S−1(S(Ai))
下图为逆向S盒的表示,逆向S盒的设计和S盒的设计相反,逆向S盒是先将状态矩阵成以一个矩阵再加一个常数矩阵,最后对得到的结果求逆元,下图为逆向S盒的表示:
4、解密密钥编排
由于解密的第一轮需要最后一个子密钥,解密的第二轮需要倒数第二个子密钥,以此类推,我们需要逆序的子密钥,实际中主要是通过首先计算整个密钥编排,然后将所有的11、13、15个子密钥存储起来实现的。
五、 AES算法与安全性
目前,已知的针对AES的分析攻击都比蛮力攻击的复杂度要高,到现在为止,人们普遍认为这些攻击方法将不会威胁到AES,这些攻击包括代数攻击、平方攻击、不可能差分攻击和相关密钥攻击,关于AES的最新研究可通过在线资源AES Lounge来了解,下面简单的介绍一下平方攻击和代数攻击以及侧信道攻击。
1、平方攻击
在平衡数据、内存、以及时间方面,针对AES最好的攻击是Square攻击,该分析方法也被AES的设计者熟知,它最初是用来攻击the block cipher Square(AES的前身),Square是选择明文攻击,下面介绍Square针对AES的攻击:
针对4轮AES的Square攻击:
在第三轮的MixColumns变换之前,得到的仍然是Λ集合,但在第三轮MixColumns之后,由于Λ集合在每个字节取遍所有的256个元素,,因此他们在每个字节上的异或和均为0,Λ集合变换到第四轮输入时,在每一个字节都是平衡的(对于Λ集合在某个位置是平衡的当且仅当所有状态该位置字节异或的结果为0,即该字节是平衡的),这种平衡经过接下来的S盒操作后有可能被破坏,如果第四轮是最后一轮,那么它不包括MixColumns操作,每一个密文字节仅仅依赖于第四轮的一个输入字节,猜测第四轮子密钥的一个子密钥的字节,则可由密文计算出第三轮输出在一个字节的值,从而验证异或结果是否为0,如果不成立,那么猜测的结果不正确,所猜测额密钥字节总共有256个候选值,上述等式成立的概率为
2
−
8
2^{-8}
2−8。
5轮AES的Square攻击:
利用对4轮的攻击,末尾增加一轮,就得到了5轮的攻击,用等价密钥
M
i
x
C
o
l
u
m
n
s
−
1
(
K
4
)
MixColumns^{-1}(K_{4})
MixColumns−1(K4)代替子密钥
(
K
4
)
(K_{4})
(K4),则可将第四轮的MixColumns和AddRoundkey交换顺序,要计算第三轮的输出在某一个字节上的值,需猜测第五轮子密钥的4个字节和第四轮等价子密钥的1个字节。
针对AES 6轮的Square攻击:
攻击者先构造一个含有
2
32
2^{32}
232个元素的明文集合,在第一轮之前,在后三列取相同的值,第一列取遍所有可能的
2
32
2^{32}
232个可能的值,然后猜测初始子密钥的相关的4个字节,,猜测最后一轮的四个字节以及第五轮的一个字节,共猜测9个字节,人们一旦猜测出这9个字节,那么猜测第六轮剩下的12个字节就非常容易了。
2、代数攻击
代数攻击的主要思想将密码体制内在加密活动描述为输入和输出之间的多元方程组,并且通过求解低次超定(方程个数比未知元个数多)或稀疏方程组来恢复密钥,所需要的数据非常少,虽然代数攻击对Rijndael算法还没有可行的攻击实例,但S盒超定稀疏方程的存在已经成为Rijndael的威胁,随着解低次多元方程组有效算法-XL算法,代数攻击采用将MQ问题转化为SAT问题求解的算法可以破解6轮DES(仅使用了一个已知明文),下面介绍一下RijndaelS盒的超定方程。上面讲到S盒是由GF(
2
8
2^8
28)下的求乘法逆的运算和GF(2)的域下的仿射变换再加常量‘63’两个步骤完成。对每个字节在其有限域中的乘法逆元,‘00’映射到本身,当不是0时,如果x的逆是
ω
\omega
ω,
x
=
ω
−
1
=
ω
254
x=\omega ^{-1}=\omega ^{254}
x=ω−1=ω254,S盒的定义如下:
其中y是输入字节x的逆元,因此
y
=
x
254
y=x^{254}
y=x254,
z
=
f
(
y
)
=
f
(
x
254
)
z=f(y)=f(x^{254})
z=f(y)=f(x254),上述公式变为:
根据z和y的关系,我们可以得到:
因为xy=1,所以
(
x
7
X
7
+
x
6
X
6
x
5
X
5
+
x
4
X
4
+
x
3
X
3
+
x
2
X
2
+
x
1
X
+
x
0
)
(
y
7
Y
7
+
y
6
Y
6
+
y
5
Y
5
+
y
4
Y
4
+
y
3
Y
3
+
y
2
Y
2
+
y
1
Y
+
y
0
)
=
1
(x_{7}X^{7}+x_{6}X^{6}x_{5}X^{5}+x_{4}X^{4}+x_{3}X^{3}+x_{2}X^{2}+x_{1}X+x_{0})(y_{7}Y^{7}+y_{6}Y^{6}+y_{5}Y^{5}+y_{4}Y^{4}+y_{3}Y^{3}+y_{2}Y^{2}+y_{1}Y+y_{0})=1
(x7X7+x6X6x5X5+x4X4+x3X3+x2X2+x1X+x0)(y7Y7+y6Y6+y5Y5+y4Y4+y3Y3+y2Y2+y1Y+y0)=1,可以通过这个公式得到八个公式,其中七个公式没有常数项,一个公式是1(概率是
255
256
\frac{255}{256}
256255),因为当X所有的系数为0时,不可能得到结果为1的等式。下面将上面y和z的关系等式带入到这八个公式,得到八个输入字节和输出字节之间的等式,如下图:
这两个方程会生成概率为1的16个方程,这样S盒就会得到23个以概率1成立的双仿射方程,在这23个方程中涉及到的变量时81个,若考虑以下两个平方方程,那么就会得到16个仿射方程,此时方程总数39,涉及的分量是137:
因此,对于Rijndael-128,如果用S盒的全部二次方程r=40,t=137,那么需要总的方程数M是8000,有N=1600个变量,如果用r=24,t=81,那么需要的方程数M是3880,N=1600。代数攻击也许是为了AES而提出来的,为了抵御线性分析和差分分析,AES的轮数设计的非常少,按说代数攻击应该给出更好的攻击效果,但是方程组容易得到,却是非常难解的,解非线性多元方程组的问题通常是NP难的。现在解方程一个比较著名的方法是XSL方法(由XL方法得来的),XL算法的提出和不断改进,带动了代数攻击的蓬勃发展。
3、侧信道攻击
自从AES发布以来,各种结果表明AES和其他密码系统一样容易受到侧信道密码分析的影响,针对加密电子设备在运行过程中的时间消耗、功率消耗或电磁辐射之类的侧信道信息泄露而对加密设备进行攻击的方法被称为侧信道攻击,侧信道攻击分为SPA-简单功耗分析和DPA-差分功耗分析,这类新型攻击的有效性远高于密码分析的数学方法,因此给密码设备带来了严重的威胁。
六、 结束语
展望未来,AES倡议背后的目的是与21世纪的单一分组密码达成一致;AES提供了至少与三重DES(两个密钥)相同的安全性,但在软件方面AES的性能要好得多。此外,对于AES,向DES或三重-DES移动时,我们需要考虑分组和密钥大小的差异。当然,大多数新应用程序将使用AES。然而,与旧应用程序的互操作性可能需要继续使用其他密码,尤其三重DES使用居多。
如果大家想学习更多关于AES的内容,可以参考这本书:The design of rijndael, AES—the advanced encryption standard
,