高级加密标准

进阶加密标准（Advanced Encryption Standard，缩写：AES），又称Rijndael加密法（ˈrɛindaːl，音似英文的「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与上的乘法反元素有关，已知具有良好的非线性特性。为了避免简单代数性质的攻击，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 之下，和一个固定多项式c(x)作乘法。
在MixColumns步骤，每一列的四个位元组透过线性变换互相结合。每一列的四个元素分别当作的系数，合并即为中的一个多项式，接着将此多项式和一个固定的多项式在模下相乘。此步骤亦可视为Rijndael有限域之下的矩阵乘法。MixColumns函数接受4个位元组的输入，输出4个位元组，每一个输入的位元组都会对输出的四个位元组造成影响。因此ShiftRows和MixColumns两步骤为这个密码系统提供了扩散性。

以下条目有对MixColumns更加详细的描述：Rijndael mix columns

**加密演算法优化**
使用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 date=20091007050854 和另外两个研究员发表了一篇论文，展示了数种针对AES的缓存时序攻击法。

**注释**

**参考文献**

**引用**

**书目**
 Nicolas Courtois, Josef Pieprzyk, "Cryptanalysis of Block Ciphers with Overdefined Systems of Equations". pp267–287, ASIACRYPT 2002.- Joan Daemen, Steve Borg and Vincent Rijmen, "The Design of Rijndael: AES - The Advanced Encryption Standard." Springer-Verlag, 2002. ISBN 3-540-42580-2.

**外部链接**
  The Rijndael Page（Forwards automatically to the AES Lounge; use old version link to browse）-  The Rijndael Page (old version)-  Literature survey on AES-  Recordings of the pronunciation of "Rijndael"（85 KB wav file）-  The archive of the old official AES website-  FIPS PUB 197: the official AES standard（PDF file）-  John Savard's description of the AES algorithm

**实现**
  参考代码 date=20110926210349 -  65+种AES硬件实施方案-  A Javascript AES calculator showing intermediate values date=20061224104805 -  Brian Gladman's BSD licensed implementations of AES- http://www.esat.kuleuven.ac.be/~rijmen/rijndael/rijndael-fst-3.0.zip Paulo Barreto公布的AES的C语言算法 date=20051217122133 -  D.J. Bernstein所写的开放版权AES实施代码 date=20170914211533 -  The GPL-licensed Nettle library also includes an AES implementation date=20061210055008 -  Compact AES implementation in hardware by IP Cores date=20070110033001 -  AES加密在Windows系统的实现 (自由公开源码) date=20061223234621 -  LGPL授权的AES实现的C语言源代码 date=20070928145819 -  广泛的AES硬件实施方案，Helion Technology date=20070113013401 -  FPGA Based AES Implementation using Nios-II Processor date=20070211032204 

**参见**
 高级加密标准评选过程