高级加密标准

高级加密标准(Rijndael)
AES圆形功能的可视化
一般的
设计师 琼·戴门(Joan Daemen)文森特·里恩曼(Vincent Rijmen)
首次出版 1998
来自 正方形
继任者 阿努比斯(Anubis),格兰克(Grand Cru)卡利纳(Kalyna)
认证 AES获胜者, CryptrecNessieNSA
密码细节
钥匙尺寸 128、192或256位
块尺寸 128位
结构 替换 - 宇宙网络
回合 10、12或14(取决于钥匙尺寸)
最好的公共隐态分析
已经发布了比完整的蛮力攻击更快的攻击,尽管截至2023年没有计算上的攻击。

对于AES-128,可以使用Biclique Attack以2 126.1的计算复杂性恢复键。对于Biclique对AES-192和AES-256的攻击,分别适用2 189.7和2 254.4的计算复杂性。相关键攻击可以分别在时间和数据中分别打破具有复杂性2 99.5和2 176的AES-256和AES-192。

另一项攻击在2009年被博客发行并作为预印本发行。这次攻击是针对AES-256,该攻击仅使用两个相关键和2 39时间来恢复9轮版本的完整256位键,或2 45次的时间具有更强类型相关的子键攻击类型的10轮版本,或11轮版本的2 70时间。

高级加密标准AES ),也以其原始名称Rijndael而闻名(荷兰语发音: [ˈrɛindaːl] ),是美国国家标准技术研究所(NIST)于2001年建立的电子数据的加密规范。

AES是由两位比利时密码师Joan DaemenVincent Rijmen开发的Rijndael Block Cipher的变体,他们在AES选择过程中向NIST提出了建议。 Rijndael是一个有不同钥匙和块大小的密码家族。对于AES,NIST选择了Rijndael家族的三名成员,每个成员的区块大小为128位,但三个不同的关键长度:128、192和256位。

AES已被美国政府采用。它取代了1977年发布的数据加密标准(DES)。AES描述的算法是一种对称键算法,这意味着使用相同的密钥用于加密和解密数据。

在美国,NIST于2001年11月26日由NIST宣布为美国FIPS Pub 197(FIPS 197)。在Rijndael Cipher出现之前,对五年的标准化过程进行了为期五年的标准化过程,在该过程中进行了15次竞争设计和评估。被选为最合适的。

AES包括在ISO / IEC 18033-3标准中。在美国商务部长唐纳德·埃文斯(Donald Evans)批准后,AES于2002年5月26日成为美国联邦政府标准。 AES有许多不同的加密软件包可用,并且是美国国家安全局(NSA)批准的第一个(也是唯一)可公开访问的密码,以获取NSA批准的加密模块中的最高机密信息。

确定标准

高级加密标准(AES)在每个:

  • FIPS Pub 197:高级加密标准(AES)
  • ISO/IEC 18033-3:块密码

密码的描述

AES基于一个被称为替代 - 宇宙网络的设计原则,并且在软件和硬件上都有效。与其前身DES不同,AES不使用Feistel网络。 AES是Rijndael的变体,固定块大小为128密钥尺寸为128、192或256位。相比之下,Rijndael本身的块和钥匙尺寸可能是32位的任何倍数,最小128位,最大为256位。大多数AES计算都是在特定有限字段中完成的。

AES在16个字节B 0的4×4列量订单阵列上操作b 1...,,B 15称国家为国家

用于AES密码的密钥大小指定将输入(称为纯文本)转换为最终输出的转换弹的数量,称为ciphertext 。回合的数量如下:

  • 128位钥匙的10发。
  • 192位钥匙的12发。
  • 256位钥匙的14轮。

每个回合由多个处理步骤组成,其中包括取决于加密密钥本身的步骤。使用相同的加密密钥,应用了一组反向回合将密文的转换为原始明文。

算法的高级描述

  1. 钥匙扩展- 圆形密钥是使用AES密钥附表从密码派生的。 AES需要一个单独的128位圆形钥匙块,再加上一个。
  2. 最初的圆形密钥添加:
    1. AddRoundKey - 使用Bitwise XOR将状态的每个字节与圆形键的字节结合使用。
  3. 9、11或13轮:
    1. SubBytes - 一个非线性替代步骤,根据查找表,每个字节都被另一个字节替换。
    2. shiftrows - 一个换位步骤,该状态的最后三行被周期性移动一定数量的步骤。
    3. MixColumns - 一个线性混合操作,该操作在状态列上运行,将每个列中的四个字节组合在一起。
    4. AddRoundKey
  4. 最后一轮(总共进行10、12或14轮):
    1. subbytes
    2. shiftrows
    3. AddRoundKey

subbytes步骤

Subbytes步骤中,状态中的每个字节都被其在固定8位查找表中所替换。 b ij = s(a ij

在Subbytes步骤中,使用8位替换盒将状态数组中的每个字节替换为SupbyTE。请注意,在第0轮之前,状态数组只是明文/输入。此操作提供了密码中的非线性。所使用的S-box源自GF上的乘法逆(28),已知具有良好的非线性属性。为了避免基于简单代数属性的攻击,S-box是通过将逆函数与可逆仿射变换相结合来构建的。还选择了S-Box以避免任何固定点(也是扰动),即,以及任何相反的固定点,即。在执行解密时,使用了invsubbytes步骤(subbytes的倒数),这需要首先进行仿射转换的倒数,然后找到乘法逆。

SHIFTROWS步骤

shiftrows步骤中,状态每一行的字节周期性向左移动。每个行的每个字节的位置数量都在逐渐不同。

Shiftrows步骤在状态行上运行;它周期性地将每行的字节移动一定偏移。对于AES,第一行保持不变。第二行的每个字节都向左移动。同样,第三行和第四行分别被两个和三排的偏移转移。这样, shiftrows步骤的输出状态的每一列均由输入状态的每个列的字节组成。此步骤的重要性是避免独立加密的列,在这种情况下,AES将退化为四个独立的块密码。

MixColumns步骤

在MixColumns步骤中,状态的每一列乘以固定的多项式。

MixColumns步骤中,使用可逆线性转换将状态每一列的四个字节组合在一起。 MixColumns函数将四个字节作为输入,并输出四个字节,每个输入字节都会影响所有四个输出字节。与shiftrows一起, MixColumns提供了密码的扩散

在此操作期间,每列将使用固定矩阵进行转换(矩阵左式列列列给了状态列的新值):

矩阵乘法由乘法和条目的添加组成。条目被视为多项式多项式系数。添加只是XOR。乘法是Modulo不可删除的多项式。如果逐位处理,则在移位后,如果移位值大于FF16,则应执行具有1B16的条件XOR(必须通过减去生成多项式的减法来纠正溢出)。这些是通常的乘法的特殊情况。

从更一般的意义上讲,每一列被视为多项式,然后将模量与固定多项式相乘。该系数显示在其与位多项式的二元表示的十六进制等效物中。混音台阶也可以看作是有限场中显示的特定MDS矩阵的乘法。 Rijndael Mixcolumns的文章进一步描述了此过程。

AddRoundKey

AddRoundKey步骤中,使用XOR操作(⊕)将状态的每个字节与圆形子键的字节结合在一起。

AddRoundKey步骤中,子键与状态结合在一起。对于每一轮,使用Rijndael的钥匙时间表从主键中得出一个子钥匙;每个子钥匙的大小与状态相同。通过使用位XOR将状态与子钥匙的相应字节组合来添加子键。

密码的优化

在具有32位或更大单词的系统上,可以通过将subbytesshiftrows步骤与MixColumns步骤相结合,通过将它们转换为一系列表格查找来加快执行此密码。这需要四个256键入32位表(一起占据4096字节)。然后可以通过16个桌子查找操作和12个32位独家操作进行回合,然后在AddRoundKey步骤中进行四个32位独家操作。或者,可以使用单个256键入的32位表(占用1024个字节),然后进行圆形旋转操作,进行表格查找操作。

使用面向字节的方法,可以将subbytesshiftrowsmixcolumns逐步组合到单回合操作中。

安全

国家安全局(NSA)审查了包括Rijndael在内的所有AES决赛入围者,并指出,所有AES都足以满足美国政府未分类的数据。 2003年6月,美国政府宣布可以使用AES来保护机密信息

AES算法(即128、192和256)的所有关键长度的设计和强度足以将机密信息保护至秘密级别。最高机密的信息将需要使用192或256个关键长度。在旨在保护国家安全系统和/或信息的产品中,必须在其收购和使用之前对旨在保护国家安全系统和/或信息的产品进行认证。

AES有10发的128位钥匙,为192位钥匙的12发子弹和256位钥匙的14发子弹。

到2006年,最著名的攻击是在7轮中进行的128位钥匙,为192位钥匙进行8发子弹,以及256位钥匙的9发。

已知攻击

对于密码学家而言,加密“断裂”比蛮力攻击更快 - 即,为每个可能的键进行一个试验解密。因此,休息可以包括与当前技术不可行的结果。尽管不切实际,理论中断有时可以提供对脆弱性模式的见解。针对广泛实现的块状加密算法,最大的成功公开爆发的蛮力攻击是2006年的Distribute.NET的64位RC5密钥。

每个额外的键长度的钥匙空间增加了2倍,如果钥匙的每个可能值都可以设置为均值,则将其转化为平均蛮力键搜索时间的一倍。这意味着蛮力搜索的努力随着关键长度而成倍增加。关键的长度本身并不意味着防止攻击的安全性,因为有一个很长的密钥的密码被发现很脆弱。

AES具有相当简单的代数框架。 2002年,尼古拉斯·考托瓦斯(Nicolas Courtois)约瑟夫·派普兹克(Josef Pieprzyk)宣布了一场名为“ XSL攻击”的理论攻击,声称在AES算法中表现出弱点,部分原因是其非线性组件的复杂性低。从那时起,其他论文表明,最初提出的攻击是不可行的。请参阅对块密码的XSL攻击

在AES选择过程中,竞争算法的开发人员写道Rijndael的算法“我们担心它在关键安全应用程序中的使用……”。然而,在2000年10月,在AES选择过程结束时,竞争算法Twofish的开发商Bruce Schneier写道,尽管他认为对Rijndael的成功学术攻击有一天会开发,但他“不相信任何人都不会相信发现一场攻击,可以让某人阅读Rijndael流量。”

直到2009年5月,对全部AE的唯一成功发表的攻击是对某些特定实现的侧向攻击。在2009年,发现了一次新的相关攻击,该攻击利用了AES关键时间表的简单性,并且复杂性为2 119 。 2009年12月,它改善到2 99.5 。这是Alex BiryukovDmitry Khovratotovich和IvicaNikolić在2009年前早些时候发现的攻击的后续行动,每235个钥匙中有一个复杂性为2 96 。但是,在任何正确设计的加密协议中,相关键攻击并不关心,因为正确设计的协议(即实施软件)将注意不要允许关联密钥,从本质上讲,它是通过限制攻击者选择相关性键的方法。

Bruce Schneier于2009年7月30日在博客上发表了另一次攻击,并于2009年8月3日作为印本发行。仅使用两个相关键和2 39时间来恢复9轮版本的完整256位密钥,或者使用2 45次的10轮版本,具有更强类型的相关subkey攻击,或2 70时间11轮版本。 256位AES使用14发子弹,因此这些攻击对全AE无效。

例如,关于Vincent Rijmen在2010年对AES-128中选择的中间关系攻击的论文,这些攻击具有更强的相关钥匙的实用性受到了批评。

2009年11月,针对AES-128降低的8轮版本的首次已知钥匙区别攻击被作为预印本发布。这种已知的钥匙区分攻击是针对类似AES的排列的篮板或中间攻击的改进,该攻击是连续两轮的置换率作为所谓的Super-S-Box的应用。它在8轮版本的AES-128上工作,时间复杂性为2 48 ,记忆复杂性为2 32 。 128位AES使用10发子弹,因此此攻击对Full AES-128无效。

对完整AE的首次关键恢复攻击是Andrey Bogdanov,Dmitry Khovratotovich和Christian Rechberger发行的,并于2011年出版。这次攻击是一场双重攻击,比蛮力比蛮力更快。它需要2 126.2操作才能恢复AES-128密钥。对于AES-192和AES-256、2 190.2和2 254.6的操作。对于AES-128,AES-192的AES-128、2 189.9和AES-256的AES- 128、2 189.9进一步提高到2 126.0 ,这是对AES的关键恢复攻击的当前最佳结果。

这是一个很小的收益,作为126位钥匙(而不是128位)仍然需要数十亿年的时间才能对当前和可预见的硬件施加冲突。此外,作者使用其技术在AES上使用128位密钥计算出最佳的攻击需要存储2 88位数据。这是大约38万亿吨的数据,这比2016年地球上所有计算机上存储的所有数据都要多。因此,对AES安全没有实际影响。空间复杂性后来已提高到256位,即9007 trabytes(同时仍然保持2 126.2的时间复杂性。

根据Snowden文件,NSA正在研究基于TAU统计数据的加密攻击是否有助于打破AES。

目前,尚无已知的实际攻击,可以使某人在正确实施时不知情读取AES加密的数据。

侧通道攻击

侧通道攻击不会攻击密码作为黑匣子,因此与经典环境中定义的密码安全无关,但在实践中很重要。他们在无意间泄漏数据的硬件或软件系统上攻击密码的实现。对AE的各种实现,有几次已知的攻击。

2005年4月, D。J。Bernstein宣布了一场缓存攻击,他用来打破使用OpenSSL的AES加密的自定义服务器。袭击需要超过2亿次选择的明文。自定义服务器旨在提供尽可能多的定时信息(服务器报告了加密操作采取的机器周期的数量)。但是,正如伯恩斯坦(Bernstein)指出的那样:“降低服务器时间戳的精度或将其从服务器的响应中消除,并不能阻止攻击:客户只是根据其本地时钟使用往返时间,并补偿了增加的噪声通过平均大量样本。”

2005年10月,Dag Arne Osvik, Adi Shamir和Eran Tromer发表了一篇论文,展示了针对OpenSSL和Linux的AES实施的几次缓存攻击dm-crypt分区加密功能。仅800次操作触发加密后,一次攻击能够获得整个AES密钥,总计65毫秒。此攻击要求攻击者能够在执行AES的同一系统或平台上运行程序。

2009年12月,发布了对某些硬件实现的攻击,该攻击使用了差异故障分析,并允许复杂性为2 32的键。

2010年11月,Endre Bangerter,David Gullasch和Stephan Krenn发表了一篇论文,该论文描述了一种实用的方法,即“接近实时”从AES-128中恢复了AES-128,而无需密码文本或违规。该方法还适用于使用压缩表(例如OpenSSL)的AES-128实现。像某些较早的攻击一样,该攻击需要能够在执行AES加密的系统上运行非特权代码,而恶意软件感染可以比命令命令root帐户更容易实现。

2016年3月,Ashokkumar C.,Ravi Prakash Giri和Bernard Menezes对AES实施进行了侧向攻击,可以在仅6-7个plaintext/piphertext中恢复完整的128位AES钥匙以前的工作需要100到一百万个加密。拟议的攻击需要标准的用户特权和一分钟不到一分钟的键进行回程算法。

许多现代CPU具有针对AE的内置硬件说明,可防止与时机相关的侧通道攻击。

量子攻击

AES-256被认为具有量子性抗性,因为它具有与AES-128对传统的非量子攻击的抗性相似的量子抗性。由于其较小的钥匙尺寸,AES-192和AES-128不被视为量子抗性。 AES-192对量子攻击的强度为96位,而AES-128具有64位针对量子攻击的强度,使它们都不安全。

NIST/CSEC验证

加密模块验证计划(CMVP)由美国政府国家标准技术研究所(NIST)计算机安全部以及加拿大政府的通信安全机构(CSE)共同运营。美国政府要求使用对NIST FIPS 140-2进行验证的加密模块的使用,以加密所有具有敏感但未分类(SBU)或更高分类的数据。从NSTISSP#11中,管理信息保证的国家政策:“保护机密信息的加密产品将由NSA认证,并且旨在保护敏感信息的加密产品将根据NIST FIPS 140-2进行认证。”

加拿大政府还建议在其部门的未分类应用中使用FIPS 140个经过验证的加密模块。

尽管NIST出版物197(“ FIPS 197”)是涵盖AES算法的独特文档,但供应商通常在FIPS 140下接近CMVP,并要求同时验证多种算法(例如Triple DESSHA1 )。因此,很少能找到具有唯一fip的密码模块,这些模块经过197的验证,而NIST本身通常不会花时间在其公共网站上分别列出FIPS 197验证的模块。取而代之的是,FIPS 197验证通常仅列为“ FIPS批准:AES”符号(具有特定FIPS 197证书编号)的“ FIPS 140验证的加密模块”。

加密算法验证程序(CAVP)允许独立验证AES算法的正确实现。成功的验证导致在NIST验证页面上列出。该测试是FIPS 140-2模块验证的先决条件。但是,成功的CAVP验证绝不意味着实施该算法的加密模块是安全的。美国政府认为缺乏FIPS 140-2验证或特定批准的加密模块,或者不能用来保护政府数据。

FIPS 140-2验证在技术上和财政上都具有挑战性。有一系列标准化的测试以及源代码审查的要素,必须在几周的时间内通过。通过批准的实验室进行这些测试的成本可能很重要(例如,美国超过30,000美元),不包括写作,测试,文档和准备验证模块所需的时间。验证后,如果模块以任何方式更改,则必须重新提交并重新评估它们。如果安全功能没有更改,则如果安全功能受到更改影响,则可以从简单的文书工作更新变为更实质性的重新测试。

测试向量

测试向量是给定输入和键的一组已知密码。 NIST将AES测试向量的参考作为AES已知答案测试(KAT)向量。

表现

高速和低RAM要求是AES选择过程的一些标准。作为所选算法,AES在各种硬件上的表现都很好,从8位智能卡到高性能计算机。

Pentium Pro上,AES加密需要每个字节的18个时钟循环,相当于200 MHz处理器的大约11 MIB/S的吞吐量。

Intel CoreAMD Ryzen CPU支持AES-NI指令集扩展程序上,吞吐量可以是多个GIB/S(甚至超过15 GIB/S在i7-12700k上)。

实施

也可以看看