目录

AES算法(一)简介

严格来说 AES 是一种通用的加密标准,通常我们常说的 AES 算法是指 AES 标准的实现算法:Rijndael 算法。

释义

  • NIST National INstitute of Standards and Technology,官网地址:https://www.nist.gov
  • DES Data Encryption Standard,数据加密标准。密钥长度是 56 比特,算法的理论安全强度是 256。
  • AES Advanced Encryption Standard,高级加密标准,标准详细说明: FIPS 197
  • 轮密钥 又称密钥编排序列,一组 N 位的密钥串,N 可为 128、192、256。

Rijndael 算法

NIST 在 1997 年 09 月 12 日公开征集更高效更安全的替代 DES 加密算法,第一轮共有 15 种算法入选,其中 5 种算法入围了决赛,分别是 Rijndael、Serpent、Twofish、RC6 和 MARS。经过 3 年的验证、评测及公众讨论之后 Rijndael 算法最终入选。

Rijndael 算法是一个分组密码算法族,其分组长度包括 128 比特、160 比特、192 比特、224 比特、256 比特,密钥长度也包括这五种长度。 AES 标准算法是选取了分组长度为 128 比特,密钥长度为 128 比特、192 比特和 256 比特的三个版本,名称分别为 AES-128、AES-196 和 AES-256,这三个版本加密思路基本一样,只是密钥扩展算法的过程会稍有不同。

Rijndael 算法的设计思想:

  • 安全性(Security) 算法足够强,抗攻击
  • 经济性(Efficiency) 算法运算效率高
  • 密钥灵活(Key Agility) 更改密钥所引入的损失尽量小,即最小消耗的密钥扩展算法
  • 适应性 (Versatility) 适用于不同的 CPU 架构,软件或硬件平台的实现
  • 设计简单(Simplicity) 轮函数的设计精简,只是多轮迭代

NIST 在征集 AES 算法的时候提出了几项硬性要求:

  • 分组加密算法:支持 128 位分组大小,128/192/256 位密钥
  • 安全性不低于 3DES,但实施与执行要比 3DES 的更高效
  • 优化过的 ANSI C 的实现代码
  • KAT(Known-Answer tests) 及 MCT(Monte Carlo Tests) 测试及验证
  • 软件及硬件实现的便捷
  • 可抵御已知攻击

Rijndael 加密流程

Rijndael 算法是基于代换-置换网络(SPN,Substitution-Permutation Network)的迭代算法。明文数据经过多轮次的转换后方能生成密文,每个轮次的转换操作由轮函数定义。。

./topic-encryption-aes-1-1.png

上图左侧为轮函数的流程,主要包含 4 种主要运算操作:字节代换(SubByte)、行移位(ShiftRow)、列混合(MixColumn)、轮密钥加(AddRoundKey)。轮函数任务就是根据密钥编排序列(即轮密钥)对数据进行不同的代换及置换等操作。

上图右侧为密钥编排方案,在 Rijndael 算法中称为密钥扩展算法(KeyExpansion)。密钥扩展算法的目的是根据种子密钥(用户密钥)生成 N 组轮密钥,不同密钥长度可生成不同组的轮密钥(128 位、192 位和 256 位长度的密钥分别生成 11、13 和 15 组轮密钥),每组轮密钥的长度为 128 位。

AES 标准算法将 128 位(16 字节)的明文以特定次序生成一个 4x4 的矩阵(每个元素是一个字节,8 位),即初始状态(state),经由轮函数的迭代转换之后又将作为下一轮迭代的输入继续参与运算直到迭代结束。

Rijndael 算法支持大于 128 位的明文分组(非 AES 标准算法),所以需要列数更多的矩阵来描述。