网络中,评论AES算法的材料浩如烟海,这儿就不再重复了。笔者在相关学习和了解的根底上,企图先从一个全景的构图下手,供给一种新的角度和阅读,协助读者更快更好的从整体结构上来了解其思路和规划。

全景图

如图所示(尽量放大看原图):

AES算法全景(图)

从这张图中,读者可以明晰的了解这个算法的要素和相关的联系。

要件

  • 数学算法

AES算法的数学理论根底,是伽罗瓦有限域和其核算规矩,以及线性代数和矩阵运算。和一般数学算法不同,伽罗瓦域的求和和乘积操作,是别的一个一个逻辑。在GF中,求和便是异或操作,乘积便是GF乘法(有其特定的核算和处理方法)。

  • 设定

AES有三种类型,通过所运用的密钥长度来进行区分。这个分类首要影响到的是密钥扩展算法的完成,和AES加密的次第(设定表中详)。

因为AES算法的类型和形式许多,为了便利评论,图中内容的根本形式是AES-256-GCM,这个也是TLS-1.3算法和规范和优先引荐暗码套件。

  • SBOX

在AES算法规矩中,SBOX是一个16×16的矩阵(实践算法中是一个一维结构),包含了00~FF的256个数值。它看起来杂乱无章,但实践上是基于某种数学原理规划而成,也可以从一个公式和核算规矩中推导核算而出。其方针是增加块变换算法的混杂功能。

SBOX的运用十分简略,便是运用查表替换方法,具体而言,便是对于某个值,可以转换为一个索引,在SBOX中查找此索引对应的值。它奇妙的运用到了SBOX的索引空间和值空间一一对应并可以灵敏相互转换的特点。 这样, SBOX替换的逆向操作也十分简略,便是运用类型indexOf的函数进行操作查找原始索引。当然,工程上也经常运用一个预核算好的反向查找表来进步功能。

SBOX也可以有许多种,AES运用一个约定好的SBOX(其多项式表达式为x8+x4+x3+x+1)参加加密、解密和密钥扩展核算,咱们可以将其当作一个常量。

  • 密钥扩展

笔者有其他文章专门具体评论了这个课题。这儿简略说来,便是可以将一个原始密钥,通过扩展算法,生成一系列子密钥,用于AES的次第操作傍边,每一轮运用的密钥都是不同的,在解密时,扩展密钥的算法相同,但密钥运用的次第,或许是反向的。

  • 核算次第

AES的核算,是分多轮操作的,每轮核算都具有特定的进程和次第,从图中可以明晰的看到这些,而且很简略了解,这些进程次第的规划准则便是尽量可以运用变量信息,对原始信息进行混杂和扩散,并确保这些操作是可逆的。

次第中的具体操作都是针对块的,包含加密钥,字替换,行位移,列混合等四种。假如有循环次第,则需求将本次第的成果,作为下一次第的输入(其实AES加解密中,就只要终究一轮操作不同)。一切进程和操作都完成后,得到的那个终究的数据块,便是整个加密的成果-密文。

  • 加密钥

运用当前核算次第的子密钥,和块对位的进行异或核算,就可以得到一个新的块。

  • 字替换

运用SBOX中,相同方位的数值,来替换块中相同方位的数值,会的到一个新的块,这个变换方法便是块替换。

  • 行位移

将每个块都可以分为4行,对于每行,都偏移一个特定的方位,就可以得到一个新的块。

  • 列混合

将需求处理的块,和一个常数块,进行线性代数的矩阵运算(当然核算规矩是GF的),就可以得到混合后的新块。

  • 解密

假如要进行解密操作,根本上便是加密操作的逆运算。行将加密操作的进程和方向都反向操作一遍。除操作进程外,每一个进程的具体操作,一般要运用对应加密函数的逆操作函数。

加密钥的逆操作最简略,只需求在运用对应的次第子密钥进行一次异或操作,就可以复原块,这是XOR核算的特性决定的;字替换的逆操作要运用一个逆向SBOX,但其实也没那么复杂,不需求一个真的的ISBOX,只需求SBOX的索引逆查就可以了。行位移,只需求依照行和位移规矩,反向偏移核算即可;列混合比较复杂,需求界说一个反向的矩阵运算函数来进行完成。 简略而言,这些运算都是可逆的,只需求依照次第和规矩,反向核算,即可以得到原始信息。

  • GCM形式

前面评论的一切内容,其实都是AES的中心算法,它关注于块加密的那个块的处理。但实践在工程和运用傍边,一个原始的信息肯定包含多个块的处理。为了解决这些问题,提出了AES的操作形式,以确保除了中心的块加解密操作之外,整个进程的安全和高效。

和AES中心算法不同,AES的操作形式,并没有一个强制的规范和算法,因此在开展和运用的进程中,业界提出了许多形式,常见的AES形式有ECB、CBC、CBF、OBF、CTR等等,它们的差异首要在于怎么处理初始化向量和块、密钥之间的联系。随着技能和安全需求的开展,又提出了CCM、GCM等新的形式,它们最中心的特点是加入了验证信息和进程,可以同时确保信息的完整性,大幅度进步了加解密进程和信息安全性。

本文评论和展示的根底是AES-GCM形式。理由是它是TLS1.3的优先算法,运用最为广泛,而且也是NIST的引荐计划。原理上而言,GCM是在CTR(计数器形式)的根底上,增加了验证相关流程来完成的。一般以为,相对于曾经和其他的形式,GCM有两个首要优势:

GCM基于计数器形式(CTR),可以运用并行运算。实践上它运用AES中心算法,核算的并不是要加密的明文,而是密钥,也便是为每个明文块都生成一个密钥,因为运用递增方法,这些密钥的输入是可以猜测的,所以后续处理可以并行完成,这样就可以使并行核算成为或许。当然,要在程序中完成这一点,还要检测开发者调度多线程和运用系统资源的能力。别的,GCM引入了认证标签,可以简略的了解为一个加密签名,可以确保数据的完整性,进步了安全性,这个标签的规划也比较奇妙,运用一个信息链接反应的运算机制,确保了逻辑的完整和紧密。

其实,关于这个形式计划,业界也是有一些争辩的。一般以为相对于CCM而言,GCM的功能稍好,但因为原理上来自CTR的原因,或许会有一些安全性方面的隐患,但好像CCM也有自己的问题,咱们权且以为相对而言GCM比较老练安稳吧。因为GCM的规划比较复杂,相关内容比较多,这儿不再展开评论,有时机笔者另行撰文探讨。

小结

从前面的评论,在了解了其原理和流程之后,咱们应该可以觉得,AES算法架构十分简洁奇妙,根本核算也十分简略,就可以完成很好的敞开包容。

实际也是如此,了解其原理的开发人员,几乎用任何语言就可以编写自己的AES算法完成,从而将其移植到任何一个核算渠道和环境傍边。咱们看到的许多完成代码其实都没有超越300行,而且根本没有什么第三方依赖。乃至,在其根底上,敞开者便利可以进行扩展(不引荐这么做,兼容性和可靠性考量),比方运用其他的SBOX、增加行替换、运用不同的Mix矩阵、修改密钥扩展函数等等,就可以“发明”新的密钥算法了。

附: AES完成代码(JS)

依据以上内容,这儿有一个简略的AES算法中心的JS完成,彻底没有第三方和库依赖,只要不到100行!当然,这个代码仅仅AES的算法中心代码,完整的运用,还需求搭配内容编码解码、块切割和补位、AES形式、初始化向量等等,所以这儿的代码仅用作原理性的研讨和学习。

别的,测验验证的示例数据,来自AES的技能白皮书:

nvlpubs.nist.gov/nistpubs/fi…

内容和进程十分威望具体,可以用查看算法的每一步和终究成果是否正确(或许是书中的处理运用的是“字”的方法,和本文中代码运用数组稍有不同,所以调试进程中看到的矩阵正好是行列翻转的,但应该不影响运转、评论和了解)。

AES算法全景(图)

附: AES算法承认进程

笔者觉得,这是一个有趣而且重要的进程,可以也让咱们可以更客观和正确的看待了解这一算法。(以下内容首要来自wiki百科)

1997年1月2日,NIST(National Institue Of Standards And Technology,国家规范和技能研讨所,负责拟定信息技能方面的管理组织)宣告,他们希望挑选一个被称为AES的加密规范,作为DES的继任者(他们或许觉得DES已经不能在信息技能快速开展的年代,很好的保护信息了)。与DES一样,这应该是一种”不是机密的、加密算法揭露披露的,可以在未来一个世纪内(口气好大)保护灵敏的政府信息的”加密规范。然而,NIST并没有简略地宣告继任者是谁,而是要求有关各方就怎么挑选继任者供给计划。来自敞开加密社区的爱好当即高涨,NIST在三个月的评论期期间就收到了很多的提交。

1997年9月12日,在需求承认阶段,终究反应的成果是确实需求一种新的暗码算法,而且应该都是块暗码,支撑128位的块巨细,以及支撑128、192和256位的密钥长度(其实,这种需求和暗码,在当时还是比较少见的)。在接下来的九个月,来自不同国家的十五种不同的规划出现并被提交。按字母次第排列,他们分别是:CAST-256、CRYPTON、DEAL、DFC、E2、FROG、HPC、LOKI97、MAGENTA、MARS、RC6、Rijndael、SAFER+、以及Twofish。

在随后进行的争辩中,暗码学家们对这些候选算法的优点和缺陷进行了调查;他们的评价包含安全方面,也包含在各式各样的情景下算法的运用完成(个人电脑的各种架构、智能卡、硬件完成),以及其在有限资源的环境下的可行性(只要十分有限的内存的智能卡、在低逻辑门数下的完成,如FPGA等)。

其中的一些规划计划在暗码剖析进程中落选,原因是存在细小的缺陷乃至是存在丧命的进犯方法,而另一些则是因为在不同环境中不良的功能表现或者是比其他的候选算法表现更差。NIST举行了两次会议评论这些提交的计划(1998年8月AES1,1999年3月AES2)。在1999年8月,他们宣告将候选名单从15个缩减至5个(MARS、RC6、Rijndael、Serpent、Twofish,也被称为AES Finalist,AES决赛算法),都由闻名的、在社区中被尊敬的暗码学家们所规划。在AES2会议投票的投票成果如下:

  • Rijndael:86拥护,10对立
  • Serpent:59拥护,7对立
  • Twofish:31拥护,21对立
  • RC6:23拥护,37对立
  • MARS:13拥护,84对立

在另一轮愈加剧烈的暗码剖析之后,终究在2000年4月AES3会议上,五个算法的代表团队对关于为什么他们各自的算法应被选作AES的原因做了演讲以及争辩。终究,2000年8月2日,NIST宣告拟将Rijndael作为建议的AES规范,并于2001年2月28日通过在联邦公报上发布公告作为FIPS草案征求意见。2001年11月,NIST宣告,AES被同意为”联邦信息处理规范”。在这个进程中,NIST因为敞开包容的态度以及选拔进程之中的专业和专心,赢得了来自暗码社区的赞誉。落选的Twofish算法的作者之一,布魯斯施奈爾),在竞选结束之后写道,”除了对NIST和AES选拔的赞美,我没什么可以说的了。”

对AES算法有理论上的进犯,但都需求海量的数据存储和运算时刻。据估计,要进犯AES加密的进犯需求的运算量到达38万亿比特,这能超越2016年全球一切核算机上存储的一切数据,要处理这些数据,现有的核算能力需求数十亿年,这样看AES的破解,在现在是彻底不可行的。

可以看到,一个强壮而安全的暗码算法的产生和老练,是一个漫长而艰苦的进程。这些暗码算法由这个世界上最顶尖的信息安全专家、数学家和暗码学专家们设想和完成,并通过这个世界上最强壮的核算机和最聪明的大脑来进行交叉测验和验证,并在学界和产业界进行广泛揭露的评论和筛选,又在实际的世界中长期安稳的运用,阐明起码在人类现有的认知领域内,这个算法和规划是安全、有用和可信的。