### AES 算法原理

**AES 的核心概念**

在深入原理之前，需要先了解 AES 的几个基本概念：

- **分组加密**：AES 是一种分组密码，它将明文数据分割成固定大小的**数据块**（block）进行加密。AES 的数据块大小固定为 **128 位**
- **密钥长度**：AES 支持三种密钥长度：**128 位、192 位和 256 位**。密钥长度越长，加密强度越高，但计算量也会相应增加
- **加密轮数**：加密过程由一系列重复的“轮”（rounds）组成。不同的密钥长度对应不同的轮数：
  - 128 位密钥：10 轮
  - 192 位密钥：12 轮
  - 256 位密钥：14 轮

**加密过程的四大步骤**

每一次加密轮都由四个基本操作构成，这些操作保证了加密过程的复杂性

1. **字节替换（SubBytes）** 这是**代换**操作。AES 使用一个预先定义好的 **S-Box**（Substitution-Box），将数据块中的每个字节替换成 S-Box 中对应的另一个字节。这个操作是非线性的，目的是为了隐藏明文和密文之间的直接代数关系
2. **行移位（ShiftRows）** 这是**置换**操作。它将数据块中的每一行进行循环左移。具体来说：
   - 第 0 行保持不变
   - 第 1 行循环左移 1 个字节
   - 第 2 行循环左移 2 个字节
   - 第 3 行循环左移 3 个字节。 这个操作实现了数据字节在不同列之间的扩散，增加了密码的混淆程度
3. **列混淆（MixColumns）** 这也是**置换**操作。这个步骤对每一列进行矩阵乘法运算。通过这个操作，每一列中的每个字节都会影响到该列中其他字节的值。这进一步加大了数据的扩散，确保了明文中的微小变化能够导致密文的巨大变化
4. **轮密钥加（AddRoundKey）** 这是**异或**（XOR）操作。在每一轮开始时，都会将当前数据块与**本轮的密钥**进行异或运算。这个操作将密钥信息注入到数据中，是整个加密过程的关键步骤。每一轮使用的密钥都是由初始密钥经过**密钥扩展**算法生成的

这四个步骤按顺序重复执行多次，最后**在最后一轮会省略列混淆步骤**。解密过程则反向执行这四个步骤