密码学 - AES 结构



AES 由一系列链接操作组成,其中一些操作涉及用特定输出替换输入(替换),另一些操作则涉及重新排列位(置换)。

有趣的是,AES 所有计算都在字节而不是位上进行。因此,AES 将明文块的 128 位视为 16 个字节。这 16 个字节被排列成四列四行,以矩阵形式进行处理。

与 DES 不同,AES 中的轮数是可变的,并且取决于密钥的长度。AES 对 128 位密钥使用 10 轮,对 192 位密钥使用 12 轮,对 256 位密钥使用 14 轮。每一轮都使用不同的 128 位轮密钥,该密钥根据原始 AES 密钥计算得出。

AES 结构示意图如下所示:

AES Structure

密码需要 128 位或 16 字节的明文块大小。密钥长度可以是 16、24 或 32 字节(128、192 或 256 位)。根据密钥长度,算法的名称为 AES-128、AES-192 或 AES-256。

单个 128 位块作为加密和解密过程的输入。在 FIPS PUB 197 中,此块表示为 4 * 4 的字节方阵。在加密或解密的每个步骤中,此块都会被复制到 State 数组中,并更新该数组。在最后阶段之后,输出矩阵包含当前状态的副本。

加密过程

这里,我们仅限于描述 AES 加密的典型轮次。每一轮都包含四个子过程。第一轮过程如下图所示:

First Round Process

密钥扩展

轮密钥使用 Rijndael 的分组密码调度表根据密码密钥计算得出。

预变换

这仅包含一个过程,即 Add_Round_Key。这里,对每个数据字节与轮密钥的一个字节执行 XOR 运算。

字节替换 (SubBytes)

通过查找设计中给出的固定表 (S-box) 来替换 16 个输入字节。结果是四行四列的矩阵。

行移位

矩阵的四行中的每一行都向左移动。任何“掉落”的条目都重新插入到行的右侧。移位如下进行:

  • 第一行不移位。
  • 第二行向左移动一个(字节)位置。
  • 第三行向左移动两个位置。
  • 第四行向左移动三个位置。
  • 结果是一个新的矩阵,它包含相同的 16 个字节,但彼此之间发生了移位。

列混合

现在使用特殊的数学函数转换四字节的每一列。此函数以一列的四个字节作为输入,并输出四个全新的字节,这些字节替换原始列。结果是另一个新的矩阵,包含 16 个新字节。需要注意的是,在最后一轮中不执行此步骤。

轮密钥加

矩阵的 16 个字节现在被视为 128 位,并与轮密钥的 128 位进行异或。如果这是最后一轮,则输出为密文。否则,将生成的 128 位解释为 16 个字节,然后我们开始另一轮类似的轮次。

解密过程

AES 密文的解密过程类似于加密过程,但顺序相反。每一轮都包含四个以相反顺序进行的过程:

  • 轮密钥加
  • 列混合
  • 行移位
  • 字节替换

由于每一轮中的子过程都是相反的,因此与 Feistel 密码不同,加密和解密算法需要单独实现,尽管它们密切相关。

广告