目录

AES算法(二)轮函数简述

本文不对轮函数做理论讲解,仅做简介讲解

轮函数主要包含 4 种运算,但不同的运算轮所做的具体运的算组合并不相同。主要区别是初始轮(Round 0)和最后一轮(Round Nr),所有中间轮的运算都是相同的,会依次进行 4 种运算,即:

  • [数据混淆] 字节代换(SubByte)
  • [数据混淆] 行移位(ShiftRow)
  • [数据混淆] 列混合(MixColumn)
  • [数据加密] 轮密钥加(AddRoundKey)

根据 Rinjdael 算法的定义,加密轮数会针对不同的分组及不同的密钥长度选择不同的数值:

迭代轮数 BS=128 位(标准 AES) BS=192 位 BS=256 位
KS=128 位 10(AES-128) 12 14
KS=192 位 12(AES-192) 12 14
KS=256 位 14(AES-256) 14 14

BS 为分组长度,KS 为密钥长度

字节代换(SubstituteBytes)

字节代换(SubBytes)是对 state 矩阵中的每一个独立元素于置换盒 (Substitution-box,S 盒)中进行查找并以此替换输入状态的操作。字节代换是可逆的非线性变换,也是 AES 运算组中唯一的非线性变换。字节代换逆操作也是通过逆向置换盒的查找及替换来完成的。

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

S 盒是根据设计原则严格计算得出的 16x16 的查询表,共 256 个元素,如下图所示:

./topic-encryption-aes-2-2.jpeg

S 盒是固定查询表,可知逆 S 盒也是 16x16 的固定查询表。

S 盒是由一个有限域 GF(256) 上的乘法求逆并串联线性仿射变换所构造出来的,不是一个随意构造的简单查询表。因其运算复杂,大部分的 AES 算法实现直接使用了查询表,但查询表的方式并不适合所有场景,如遇到不能使用查询表的场景(如硬件存储限制),则要实现与 S 盒替换等价的运算逻辑。

行移位(ShiftRows)

行移位主要目的是实现字节在每一行的扩散,属于线性变换。

./topic-encryption-aes-2-3.png

列混合(MixColumns)

列混合是通过将 state 矩阵与常数矩阵 C 相乘以达成在列上的扩散,属于代替变换。列混合是 Rijndael 算法中最复杂的一步,其实质是在有限域 GF(256) 上的多项式乘法运算。

./topic-encryption-aes-2-4.png

轮密钥加(AddRoundKey)

密钥加是将轮密钥与 state 矩阵进行运算,此步骤属于真正意义上的加密。

./topic-encryption-aes-2-5.png