目录
[结构:通常状态是一个 4×N 字节的矩阵,这里的 N 取决于分组长度。](#结构:通常状态是一个 4×N 字节的矩阵,这里的 N 取决于分组长度。)
[(1) 字节代换(SubBytes):](#(1) 字节代换(SubBytes):)
[1 .密钥扩展](#1 .密钥扩展)
AES(Advanced Encryption Standard)即高级加密标准,是一种对称密钥加密算法,于 2001 年被美国国家标准与技术研究院(NIST)确定为新的加密标准,用以取代 DES 算法。
一、算法背景
在 AES 之前,DES(Data Encryption Standard)是广泛使用的加密标准,但随着计算机性能的提升,DES 的 56 位密钥长度逐渐变得容易被暴力破解。为了寻找更安全、高效的加密算法,NIST 于 1997 年发起了 AES 算法征集活动,最终比利时密码学家 Joan Daemen 和 Vincent Rijmen 设计的 Rijndael 算法脱颖而出,成为了 AES 标准。
1997年4月15日美国国家标准技术研究所(NIST)发起征集AES(Advanced Encryption Standards)算法的活动,并专门成立了AES工作组。
- 基本要求:AES应该像DES和TDES那样是一个块加密方法,并且至少像TDES一样安全,但是其软件实现应该比TDES更加有效
- NIST指定AES必须:公开算法;分组大小为128比特的分组密码,支持密钥长度为128、192和256比特;通用性
对AES候选方案的评审标准有3条:
- 全面的安全性,这是最为重要的指标。
- 性能,特别是软件实现的处理性能。
- 算法的知识产权等特征。
1998年确定第一轮15个候选者
1999年确定第二轮五个候选者
- MARS
- RC6
- Rijndael
- Serpent
- Twofish
经过多轮评估、测试, NIST于2000年10月2日正式宣布选中比利时密码学家Joan Daemen 和 Vincent Rijmen 提出的密码算法Rijndael NIST于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准
AES算法与Rijndael算法
常常将AES算法称为Rijndael算法;
严格地讲,Rijndael算法和AES算法并不完全一样,因为Rijndael算法是数据块长度和加密密钥长度都可变的迭代分组加密算法,其数据块和密钥的长度可以是128位、192位和256位。尽管如此,在实际应用中二者一般被认为是相同的。
二、算法特点
1.安全性高
AES 支持 128 位、192 位和 256 位三种密钥长度,目前尚未发现有效的针对 AES 的破解方法,能够为数据提供强大的安全保障。
2.效率高
AES 算法的设计使得它在硬件和软件实现上都具有较高的效率,无论是在嵌入式设备还是高性能服务器上,都能快速完成加密和解密操作。
3.灵活性好
AES 可以工作在多种模式下,如 ECB(电子密码本模式)、CBC(密码块链接模式)、CFB(密码反馈模式)、OFB(输出反馈模式)和 CTR(计数器模式)等,以满足不同的应用场景需求。
三、算法说明
3.1状态、种子密钥和轮数的概念
(1)状态(State)
定义
类似于明文分组和密文分组,算法的中间结果也须分组,称算法中间结果的分组为状态 ,所有的操作都在状态上进行。状态可以用以字节为元素的矩阵阵列表示,该阵列有4行,列数记为Nb,Nb等于分组长度除以32。本质上是一个**二维字节数组,**在 AES 算法中,明文和密文都被划分为固定大小的块,而状态就用于存储这些数据块在加密或解密各个阶段的中间结果。
结构:通常状态是一个 4×N 字节的矩阵,这里的 N 取决于分组长度。
种子密钥类似地用一个以字节为元素的矩阵阵列表示,该阵列有4行,列数记为Nk,Nk等于分组长度除以32。下图是Nb=6的状态和Nk=4的种子密钥的矩阵阵列表示。

(2)种子密钥
定义
种子密钥是用户提供的初始密钥,它是 AES 加密和解密的基础。种子密钥的长度可以是 128 位、192 位或 256 位,用户可以根据具体的安全需求选择合适的密钥长度。
作用
种子密钥本身并不直接用于每一轮的加密操作,而是通过密钥扩展算法生成一系列轮密钥。密钥扩展算法会根据种子密钥生成足够数量的轮密钥,这些轮密钥会在不同的加密轮次中使用。每一轮的轮密钥长度与分组长度相同,都是 128 位。
示例
假如用户选择了一个 128 位的种子密钥,那么在加密过程中,密钥扩展算法会基于这个种子密钥生成 11 个 128 位的轮密钥,其中一个用于初始轮,另外 10 个分别用于后续的 10 轮加密操作。
(3)轮数(Rounds)
定义
轮数指的是 AES 加密过程中进行的迭代次数。AES 算法的加密过程由多个轮次组成,每一轮都会对状态进行一系列的变换操作,从而逐步增强加密的安全性。
轮数的确定
轮数由分组长度和种子密钥的长度共同决定,具体对应关系如下:
分组长度(位) | 种子密钥长度(位) | 轮数 |
---|---|---|
128 | 128 | 10 |
128 | 192 | 12 |
128 | 256 | 14 |
192 | 192 | 12 |
192 | 256 | 14 |
256 | 256 | 14 |
作用
增加轮数可以增强加密的安全性,因为更多的轮次意味着更多的变换操作,使得攻击者更难通过分析密文来破解密钥。但同时,轮数的增加也会导致加密和解密的计算量增大,降低算法的效率。所以在实际应用中,需要根据具体的安全需求和性能要求来选择合适的种子密钥长度和轮数。
3.2加密过程
AES 是一种分组密码算法,它将明文数据分成固定长度的块(通常为 128 位),然后对每个块进行加密处理。加密过程主要包括以下几个步骤:
1.密钥扩展
目的
根据输入的种子密钥生成多个轮密钥,每一轮加密都使用不同的轮密钥。轮密钥的数量由密钥长度决定,128 位密钥对应 10 轮加密,需 11 个轮密钥;192 位密钥对应 12 轮加密,需 13 个轮密钥;256 位密钥对应 14 轮加密,需 15 个轮密钥。
过程
将种子密钥按字节存储在一个数组中。
以 4 字节为一个字(Word),将密钥数组划分为若干字。
通过一系列的变换,包括字节代换、循环移位和与轮常量异或等操作,从种子密钥生成所有轮密钥
2.初始轮
目的
将明文块与第一轮轮密钥进行异或操作,为后续的加密轮次做准备。
过程
将 128 位的明文按字节存储在一个 4×4 的状态矩阵中。
将第一轮轮密钥也按字节排列成 4×4 的矩阵。
对状态矩阵和轮密钥矩阵的对应元素进行异或运算,得到初始轮后的状态矩阵。
3.多轮加密
除了初始轮和最后一轮,中间的每一轮都包括四个基本操作:
(1) 字节代换(SubBytes):
**目的:**使用一个固定的 S 盒对每个字节进行非线性替换,增强加密的混淆性。
过程:使用一个固定的 S 盒(Substitution Box),将状态矩阵中的每个字节替换为 S 盒中对应位置的值。
代换表(即S-盒)是可逆的,由以下两个变换的合成得到:
首先,将字节看作GF(28)上的元素,映射到自己的乘法逆元,'00'映射到自己。
其次,对字节做如下的(GF(2)上的,可逆的)仿射变换:

上述S-盒对状态的所有字节所做的变换记为:
ByteSub (State)

ByteSub的逆变换由代换表的逆表做字节代换,可通过如下两步实现,首先进行仿射变换的逆变换,再求每一字节在GF(28)上逆元。
(2)行移位(ShiftRows):
目的:对状态矩阵的行进行循环移位,增加数据的扩散性。
过程:将状态矩阵的第 0 行保持不变,第 1 行循环左移 1 个字节,第 2 行循环左移 2 个字节,第 3 行循环左移 3 个字节。
行移位是将状态阵列的各行进行循环移位,不同状态行的位移量不同。第0行不移动,第一行循环左移C1个字节,第二行循环左移C2个字节,第三行循环左移C3个字节。位移量C1、C2、C3的取值与Nb有关,由下图给出。

按指定的位移量对状态的行进行的行移位运算记为:
ShiftRow (State)

ShiftRow的逆变换是对状态阵列的后三列分别以位移量Nb -C1、Nb - C2、Nb - C3进行循环移位,使得第i行第j列的字节移位到(j+Nb- Ci) mod Nb。
(3)列混合(MixColumns):对状态矩阵的每一列进行线性变换,进一步扩散数据。
目的:对状态矩阵的列进行线性变换,进一步扩散数据。
过程:将状态矩阵的每一列视为一个多项式,与一个固定的多项式进行模运算,得到新的列。
列混合变换中,将状态阵列的每个列视为GF(28)上的多项式,再与一个固定的多项式c(x)进行模x4+1乘法。当然要求c(x)是模x4+1可逆的多项式,否则列混合变换就是不可逆的,因而会使不同的输入分组对应的输出分组可能相同。Rijndael的设计者给出的c(x)为(系数用16进制数表示):
c(x)='03'x3+'01'x2+'01'x+'02'
c(x)是与x4+1互素的,因此是模x4+1可逆的。列混合运算也可写为矩阵乘法。设b(x)= c(x) a(x),则

这个运算需要做GF(28)上的乘法,但由于所乘的因子是三个固定的元素02、03、01,所以这些乘法运算仍然是比较简单的。
对状态State的所有列所做的列混合运算记为:
MixColumn(State)

列混合运算的逆运算是类似的,即每列都用一个特定的多项式d(x) 相乘。d(x)满足
('03'x3+'01'x2+'01'x+'02')d(x) ='01'
d(x)= '0B'x3+'0D'x2+'09'x+'0E'
(4) 轮密钥加(AddRoundKey):将状态矩阵与当前轮的轮密钥进行异或操作。
目的:将当前轮的状态矩阵与该轮的轮密钥进行异或操作,引入密钥信息。
过程:将状态矩阵和轮密钥矩阵的对应元素进行异或运算。
密钥加是将轮密钥简单地与状态进行逐比特异或。轮密钥由种子密钥通过密钥编排算法得到,轮密钥长度等于分组长度Nb。
状态State与轮密钥RoundKey的密钥加运算表示为:
AddRoundKey (State, RoundKey)
密钥加是将轮密钥简单地与状态进行逐比特异或。轮密钥由种子密钥通过密钥编排算法得到,轮密钥长度等于分组长度Nb。
状态State与轮密钥RoundKey的密钥加运算表示为:
AddRoundKey (State, RoundKey)

4.最后一轮:
最后一轮与中间轮的操作基本相同,但不进行列混合操作,只包含字节代换、行移位和轮密钥加三个步骤。
3.3解密过程
AES 的解密过程与加密过程类似,但操作顺序相反,并且使用的是加密过程中生成的轮密钥的逆变换。具体步骤如下:
1 .密钥扩展
这一步与加密过程中的密钥扩展完全相同。依据输入的种子密钥,借助密钥扩展算法生成一系列轮密钥。轮密钥的数量由密钥长度决定,例如 128 位密钥需生成 11 个轮密钥,192 位密钥需 13 个,256 位密钥需 15 个。
2.初始轮(AddRoundKey)
目的:把密文块与最后一轮的轮密钥进行异或操作,为后续的解密轮次做准备。
过程:
将 128 位的密文按字节存于一个 4×4 的状态矩阵中。
把最后一轮轮密钥也按字节排列成 4×4 的矩阵。
对状态矩阵和轮密钥矩阵的对应元素做异或运算,得到初始轮后的状态矩阵。
3.多轮解密(除初始轮和最后一轮)
(1)逆字节代换(InvSubBytes)
目的:对状态矩阵中的每个字节执行与加密时字节代换相反的操作,恢复字节的原始值。
过程:使用一个固定的逆 S 盒(与加密时的 S 盒对应),把状态矩阵中的每个字节替换为逆 S 盒中对应位置的值。
(2)逆行移位(InvShiftRows)
目的:对状态矩阵的行进行与加密时行移位相反的循环移位操作,恢复行的原始顺序。
过程:将状态矩阵的第 0 行保持不变,第 1 行循环右移 1 个字节,第 2 行循环右移 2 个字节,第 3 行循环右移 3 个字节。
(3)逆列混合(InvMixColumns)
目的:对状态矩阵的列进行与加密时列混合相反的线性变换,恢复列的原始值。
过程:把状态矩阵的每一列视为一个多项式,与一个固定的逆多项式进行模运算,得到新的列。
(4)轮密钥加(AddRoundKey)
目的:将当前轮的状态矩阵与该轮的轮密钥进行异或操作,引入密钥信息。
过程:对状态矩阵和轮密钥矩阵的对应元素进行异或运算。
4.最后一轮
最后一轮与中间轮的操作基本相同,但不进行逆列混合操作,仅包含逆字节代换、逆行移位和轮密钥加三个步骤。经过这一轮操作后,状态矩阵中的内容即为解密后的明文。
四、算法应用
AES 算法在各种领域都有广泛的应用,包括:
网络通信:
在 SSL/TLS 协议中,AES 被用于加密网络传输的数据,确保数据在传输过程中的机密性和完整性。
存储加密:
许多操作系统和存储设备都支持 AES 加密,用于保护硬盘、U 盘等存储介质上的数据安全。
金融领域:
在银行、支付系统等金融领域,AES 被广泛应用于保护用户的账户信息、交易数据等敏感信息。