种一棵树最好的时间是十年前,其次是现在。

对称密钥算法-现代密码学的起点

20世纪40年代,Enigma 机器的加密在当时被视为无法破解的,但却被艾伦 · 图灵和他的团队破解了,他们利用高等数学和统计学,开发的多种密码分析技术,为现代密码分析奠定了基础。

1949年,克劳德·香农(Claude Shannon)发表了论文《A Mathematical Theory of Communication》(通信的数学理论),香农的研究包括混淆和扩散的概念,这些概念在对称加密算法的设计中起到了关键作用,为现代密码学奠定了理论基础。

DES

到了1960年代末期,计算机技术更是迅猛发展,人们逐渐意识到传统的加密方法已经无法满足日益增长的信息安全需求,传统的方法往往过于简单,容易受到暴力破解等攻击。在这样的背景下,NBS(美国国家标准局,现在的NIST)开始向公众征集加密算法作为数据加密标准DES,Data Encryption Standard),但没有一个提案可以满足要求。在二次征集中,IBM 提交的一种算法被有限接受了。

1975年3月17日,针对 DES,美国联邦政府在“联邦公报”上向公众征集意见,次年,NBS 也举行了两个开放式研讨会。各方给出了很多意见,总结下来有两条最关键,一是算法里存在不透明的设计,二是 DES 的密钥只有56位被用于加密,它的密钥长度太短了,这让 DES 被公众怀疑算法里存在 NSA(美国国家安全局)的后门。

虽然存在一些批评,在1976年11月 NBS 还是将 DES 确定为联邦标准。围绕着 DES 的种种争议,进而也推动了现代的块密码及密码分析的发展。

DES 是一种对称加密算法,加密和解密使用相同的密钥,它基于早先密码学家 Horst Feistel 开发的“Feistel结构”的加密模式。在加密过程中,算法先将原始数据分成64比特(8字节)的小块,如果不够,会进行填充。接下来对每个小块的比特位按照一定规则进行初始置换,为的是增加加密的混淆度,输出也是64位的中间数据块。

DES 的密钥长度是64位,但实际只有56位被用于加密,其余8位用于奇偶校验。算法将56位初始密钥经过一系列变换得到16个48位的子密钥,这16个密钥用来执行16次(轮)迭代。在每一次迭代中,算法将64位的中间数据块分成左右两部分,先将左半部分进行扩展置换,得到48位的扩展数据块(比输入的数据长了16比特);与当前的子密钥进行异或运算,将结果送入S盒(S-box)之后,得到32位的输出数据块;然后和右半部分进行异或运算,得到新的左半部分;最后将左右两部分互换,得出一个新的64位数据块。这个过程重复16次后执行逆置换,得出最终的密文。

DES 的应用非常广泛,在各行业领域都在使用,比如:金融、银行、保险等领域的数据加密,通信领域的语音、数据加密,计算机领域的软件、文件加密等等。但是 DES 的密钥较短,随着计算机算力的快速发展,它的安全性问题也暴露了出来,1999年1月,DES 密钥在22小时15分钟内便被破解了。

为了缓解 DES 的安全问题,3DES 出现了,它采用了更长的密钥,相当于对每个数据块执行3次DES。但它和 DES 的原理是相同的,并非全新的算法。加之 DES 本身就慢,三次 DES 更加缓慢。如今,3DES 已经逐渐被更安全的 AES 代替。

AES

AES(Advanced Encryption Standard,高级加密标准)算法的起源可以追溯到20世纪90年代,为了替代过时的 DES,NIST 发起了一项国际竞赛,征集新的加密算法方案。

不同于 DES,AES 的选拔过程是完全公开透明的,要求加密算法能够在未来一个世纪内保护敏感的政府信息。1997年9月,NIST 发布了 AES 算法的候选标准征集公告,设定了一些基本要求:

  • 算法必须是对称的区块加密算法。
  • 支持128位、192位和256位的密钥长度。
  • 算法需要在硬件和软件中都能高效运行。

1998年,这次征集结果获得了15个候选算法的提案,经筛检后,很快就减少到了11个。1999年,经过公开评审,候选的算法提案减少到了5个:

  1. MARS(IBM 提交)
  2. RC6(RSA Security 提交)
  3. Serpent(Ross Anderson, Eli Biham 和 Lars Knudsen 提交)
  4. Twofish(Bruce Schneier 等人提交)
  5. Rijndael(Joan Daemen 和 Vincent Rijmen 提交)

这些算法经过公开的两轮严格的评审和测试,包括加密速度、安全性、存储需求和硬件实现的复杂度等方面的评估。Rijndael 算法因其卓越的安全性、高效性以及在硬件和软件中的灵活实现能力,力压群雄,最终脱颖而出。2000年8月,NIST 最终选定了由比利时密码学家 Joan Daemen 和 Vincent Rijmen 开发的 Rijndael 算法作为 AES 标准。在选拔过程中,NIST 专注的表现和开放包容态度,也赢得了密码社区的赞誉,就连落选的算法 Twofish 其中一位作者 Bruce Schneier 都写道:“除了对 NIST 和 AES 选拔的赞美,我没什么可以说的了”。

AES 算法的选拔并不仅仅考虑是否存在弱点,算法的速度 、是否容易实现也都在考虑范围内。不仅加密本身的速度要快,密钥的生成速度也很重要。 此外,这种算法还必须能够在各种平台上有效工作,包括低性能设备中运行速度也要足够快。

加密过程

不同于 DES 的 Feistel 结构,AES 使用的是替换-置换网络(Substitution Permutation Network,简称为 SP 网络或 SPN),而且支持更长的密钥:128,192和256比特。

AES 是区块密码算法,会把输入切分称固定大小的区块,即128比特,16字节,以4行4列的矩阵的方式排列。AES 是以字节为单位进行计算的,不是按位计算。

计算过程按轮(次)进行,每轮都进行四个步骤:字节替换(Byte Substitution)、行移位(Shift row)、列混合(Mix column)、轮密钥相加(Add Round Key)。轮密钥(Round Key)由主密钥计算得出,用来参与每一轮某些步骤的计算。

  1. 字节替换
    通过查找一张称为S盒的8位表,对输入进行逐个字节替换。为避免简单代数性质的攻击,建构S盒成了关键。S盒结合了乘法逆元素和一个可逆的仿射变换矩阵,而且刻意避开了不动点与反不动点。以S盒替换字节会出现类似错排的结果。

字节替换|360px

  1. 行移位
    这个步骤对输入的16字节表的每一行按某个偏移量执行位移,第一行保持不变,第二行每个字节向左循环移动一格,第三行向左移动两个,第四行向左移动三格。偏移量随着列数递增。

行移位|360px

  1. 列混合
    执行矩阵运算,将每一列与轮密钥进行异或运算。

列混合|360px

  1. 轮密钥相加
    这个步骤中,轮密钥参与运算,与上一步骤输出的正方形矩阵执行异或。如果是最后一轮,输出的16字节就是密文,否则会作为下一轮的输入。

轮密钥相加|360px

总结一下,AES 的加密过程是一系列的查表和异或运算,在现代计算机上执行这些运算是非常快的。AES 对每一轮的输入都进行了加密(DES 的 Feistel 网络只会加密输入的一半),而且 AES 加密的四个步骤都可以按行和列进行并行计算。这也是 AES 性能很高的主要原因。AES 的解密过程就是加密的逆过程,将加密过程反向执行就能得到原文。

由于 AES 如此流行,大多数现代 CPU 都支持 AES 指令集,因此,使用 AES 加密解密会有极高的性能。除了 AES 之外,还有一些比较流行的对称密码算法,比如 ChaCha20、Salsa20 和 Blowfish 等。在一些不支持 AES 指令集的 CPU 上,比如老旧的 ARM,ChaCha20 的性能比 AES 更好。

对 AES 的攻击

AES 非常流行,在今天各行业的软件产品中有着广泛的使用,众多硬件产品也对 AES 有着广泛支持,包括 RFID 这些成本低廉的环境。围绕着AES的安全性研究也没停止,比如,2009年,两位以色列研究人员提出了一种针对AES-128的相关密钥攻击,可以将破解AES-128的复杂度降低到281次方;2014年,谷歌研究人员提出了一种名为 Themis 的密码分析攻击方法,可以把破解 AES-256 的复杂度降低到 2128次方。尽管对于密钥长度为192位和256位的AES存在一些学术攻击,但至今为止,还没发现针对 AES 的使用密码分析攻击。若没出现颠覆性的密码分析技术,在可预见的未来,AES 都可以提供良好的安全性。

版权声明: 本文为原创内容,未经许可,不得转载。