AES 加密/解密

SubBytes 是 AES 算法四步骤之一

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),又称 Rijndael 加密法(荷兰语发音:,音似英文的“Rhine doll”),是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的 DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于 2001 年 11 月 26 日发布于 FIPS PUB 197,并在 2002 年 5 月 26 日成为有效的标准。现在,高级加密标准已然成为对称密钥加密中最流行的算法之一。

该算法为比利时密码学家 Joan Daemen 和 Vincent Rijmen 所设计,结合两位作者的名字,以 Rijndael 为名投稿高级加密标准的甄选流程。

沿革

Rijndael 是由 Daemen 和 Rijmen 早期所设计的 Square 改良而来;而 Square 则是由 SHARK 发展而来。

不同于它的前任标准 DES,Rijndael 使用的是代换-置换网络,而非 Feistel 架构。

密码说明

严格地说,AES 和 Rijndael 加密法并不完全一样(虽然在实际应用中两者可以互换),因为 Rijndael 加密法可以支持更大范围的区块和密钥长度:AES 的区块长度固定为 128 比特,密钥长度则可以是 128,192 或 256 比特;而 Rijndael 使用的密钥和区块长度均可以是 128,192 或 256 比特。加密过程中使用的密钥是由 Rijndael 密钥生成方案产生。

大多数 AES 计算是在一个特别的有限域完成的。

AES 加密过程是在一个 4×4 的字节矩阵上运作,这个矩阵又称为“体(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个 Byte)。(Rijndael 加密法因支持更大的区块,其矩阵的“列数(Row number)”可视情况增加)加密时,各轮 AES 加密循环(除最后一轮外)均包含 4 个步骤:

  • AddRoundKey—矩阵中的每一个字节都与该次回合密钥(round key)做 XOR 运算;每个子密钥由密钥生成方案产生。
  • SubBytes—透过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。
  • ShiftRows—将矩阵中的每个横列进行循环式移位。
  • MixColumns—为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每内联的四个字节。最后一个加密循环中省略 MixColumns 步骤,而以另一个 AddRoundKey 取代。

AddRoundKey 步骤

在 AddRoundKey 步骤中,将每个状态中的字节与该回合密钥做异或(⊕)。

AddRoundKey 步骤,回合密钥将会与原矩阵合并。在每次的加密循环中,都会由主密钥产生一把回合密钥(透过 Rijndael 密钥生成方案产生),这把密钥大小会跟原矩阵一样,以与原矩阵中每个对应的字节作异或(⊕)加法。

SubBytes 步骤

在 SubBytes 步骤中,矩阵中各字节被固定的 8 位查找表中对应的特定字节所替换, S; bij = S (aij)

在 SubBytes 步骤中,矩阵中的各字节透过一个 8 位的 S-box 进行转换。这个步骤提供了加密法非线性的变换能力。S-box 与GF(28)上的乘法反元素有关,已知具有良好的非线性特性。为了避免简单代数性质的攻击,S-box 结合了乘法反元素及一个可逆的仿射变换矩阵建构而成。此外在建构 S-box 时,刻意避开了不动点与反不动点,即以 S-box 替换字节的结果会相当于错排的结果。Rijndael S-box 条目有针对 S-box 的详细描述。

ShiftRows 步骤

在 ShiftRows 步骤中,矩阵中每一列的各个字节循环向左方位移。位移量则随着列数递增而递增。

ShiftRows 描述矩阵的行操作。在此步骤中,每一行都向左循环位移某个偏移量。在 AES 中(区块大小 128 位),第一行维持不变,第二行里的每个字节都向左循环移动一格。同理,第三行及第四行向左循环位移的偏移量就分别是 2 和 3。128 位和 192 比特的区块在此步骤的循环位移的模式相同。经过 ShiftRows 之后,矩阵中每一竖列,都是由输入矩阵中的每个不同列中的元素组成。Rijndael 算法的版本中,偏移量和 AES 有少许不同;对于长度 256 比特的区块,第一行仍然维持不变,第二行、第三行、第四行的偏移量分别是 1 字节、2 字节、3 字节。除此之外,ShiftRows 操作步骤在 Rijndael 和 AES 中完全相同。

MixColumns 步骤

在 MixColumns 步骤中,每个直列都在 modulo x4 + 1 之下,和一个固定多项式 c(x)作乘法。

在 MixColumns 步骤,每一列的四个字节透过线性变换互相结合。每一列的四个元素分别当作 1 , x , x2 , x3 的系数,合并即为 GF(28) 中的一个多项式,接着将此多项式和一个固定的多项式 c(x) = 3x3 + x2 + x + 2 在模 x4 + 1 下相乘。此步骤亦可视为 Rijndael 有限域之下的矩阵乘法。MixColumns 函数接受 4 个字节的输入,输出 4 个字节,每一个输入的字节都会对输出的四个字节造成影响。因此 ShiftRows 和 MixColumns 两步骤为这个密码系统提供了扩散性。

加密算法优化

使用 32 或更多比特寻址的系统,可以事先对所有可能的输入建立对应表,利用查表来实现 SubBytes,ShiftRows 和 MixColumns 步骤以达到加速的效果。这么作需要产生 4 个表,每个表都有 256 个格子,一个格子记载 32 位的输出;约占去 4KB(4096 字节)存储器空间,即每个表占去 1KB 的存储器空间。如此一来,在每个加密循环中,只需要查 16 次表,作 12 次 32 位的 XOR 运算,以及 AddRoundKey 步骤中 4 次 32 位 XOR 运算。若使用的平台存储器空间不足 4KB,也可以利用循环交换的方式一次查一个 256 格 32 位的表。

然而,实际实现中应避免使用这样的对应表,否则可能因为产生缓存命中与否的差别而使旁道攻击成为可能。

安全性

截至 2006 年,针对 AES 唯一的成功攻击是旁道攻击或社会工程学攻击。美国国家安全局审核了所有的参与竞选 AES 的最终入围者(包括 Rijndael),认为他们均能够满足美国政府传递非机密文件的安全需要。2003 年 6 月,美国政府宣布 AES 可以用于加密机密文件:

AES 加密算法(使用 128,192,和 256 比特密钥的版本)的安全性,在设计结构及密钥的长度上俱已到达保护机密信息的标准。最高机密信息的传递,则至少需要 192 或 256 比特的密钥长度。用以传递国家安全信息的 AES 实现产品,必须先由国家安全局审核认证,方能被发放使用。

这标志着,由美国国家安全局 NSA 批准在最高机密信息上使用的加密系统首次可以被公开使用。许多大众化产品只使用 128 位密钥当作默认值;由于最高机密文件的加密系统必须保证数十年以上的安全性,故推测 NSA 可能认为 128 位太短,才以更长的密钥长度为最高机密的加密保留了安全空间。

通常破解一个区块加密系统最常见的方式,是先对其较弱版本(加密循环次数较少)尝试各种攻击。AES 中 128 位密钥版本有 10 个加密循环,192 比特密钥版本有 12 个加密循环,256 比特密钥版本则有 14 个加密循环。至 2006 年为止,最著名的攻击是针对 AES 7 次加密循环的 128 位密钥版本,8 次加密循环的 192 比特密钥版本,和 9 次加密循环的 256 比特密钥版本所作的攻击。

由于已遭破解的弱版的 AES,其加密循环数和原本的加密循环数相差无几,有些密码学家开始担心 AES 的安全性:要是有人能将该著名的攻击加以改进,这个区块加密系统就会被破解。在密码学的意义上,只要存在一个方法,比穷举法还要更有效率,就能被视为一种“破解”。故一个针对 AES 128 位密钥的攻击若“只”需要 2120计算复杂度(少于穷举法 2128),128 位密钥的 AES 就算被破解了;即便该方法在目前还不实用。从应用的角度来看,这种程度的破解依然太不切实际。最著名的暴力攻击法是 distributed.net 针对 64 位密钥 RC5 所作的攻击。

其他的争议则着重于 AES 的数学结构。不像其他区块加密系统,AES 具有相当井然有序的代数结构。虽然相关的代数攻击尚未出现,但有许多学者认为,把安全性建立于未经透彻研究过的结构上是有风险的。Ferguson,Schroeppel 和 Whiting 因此写道:“...我们很担心 Rijndael 算法应用在机密系统上的安全性。”

2002 年,Nicolas Courtois 和 Josef Pieprzyk 发表名为 XSL 攻击的理论性攻击,试图展示 AES 一个潜在的弱点。但该攻击的数学分析有点问题,推测应是作者的计算有误。因此,这种攻击法是否对 AES 奏效,仍是未解之谜。就现阶段而言,XSL 攻击 AES 的效果不十分显著,故将之应用于实际情况的可能性并不高。

旁道攻击

旁道攻击,又称旁路攻击、侧信道攻击,是一种基于从密码系统的物理实现中获取的信息的攻击方式。它不攻击加密算法本身,而是攻击那些基于不安全系统(会在不经意间泄漏信息)上的加密系统。

2005 年 4 月,D.J. Bernstein 公布了一种缓存时序攻击法,他以此破解了一个装载 OpenSSL AES 加密系统的客户服务器。为了设计使该服务器公布所有的时序信息,攻击算法使用了 2 亿多条筛选过的明码。对于需要多个跳跃的国际互联网而言,这样的攻击方法并不实用。Bruce Schneier 称此攻击为“好的时序攻击法”。

2005 年 10 月,Eran Tromer (页面存档备份,存于互联网档案馆)和另外两个研究员发表了一篇论文,展示了数种针对 AES 的缓存时序攻击法。