AES加密详细解释

AES简单介绍

常见密码算法我们将其分为三类:

  1. 对称密码算法(Symmetric-key Algorithm)
  2. 非对称密码算法(Asymmetric-key Algorithm)
  3. 摘要算法(Digest Algorithm)

对称密码算法是指加密秘钥和解密秘钥相同的密码算法

而对称密码又分为分组密码算法流密码算法

进入正题:

AES全称为Advanced Encryption Standard(高级加密标准),属于对称密码算法中的分组密码算法

分组密码大体上是先将明文分成若干个明文块,再对每个明文块用相同的密钥和算法进行加密,最后将加密后的密文块拼接在一起。

AES是目前安全强度最高且广泛应用的分组密码。

常见的AES-128处理128比特的块,使用的是128比特的密钥。该密码在实际上想要破解是不可行的,目前公开的任何攻击方法也只是理论上可行。

AES-128加密流程

可以点击这里查看大佬做的动画解析

我们先准备一个s-box

image-20250710145544144

我们后续会需要用到

一、密钥拓展

我们最初应当由128位初始密钥,形成一个 4×4 字节矩阵(16 字节)

W₀ W₁ W₂ W₃ W₄ W₅ W₆ W₇
00 10 20 30
01 11 21 31
02 12 22 32
03 13 23 33

以上表格中每一个元素都是十六进制

上表中,左侧4*4矩阵已经可以成为第一块轮密钥,在后续的加密过程中,它负责参与对明文块的第一轮加密

我们需要按照以下算法把矩阵往右侧延申,再得到一个4*4的矩阵,用于第二轮加密,我们把要生成的每一列元素记为Wᵢ

生成Wᵢ时,需要拿出Wᵢ₋₄和Wᵢ₋₁

然后需分类讨论:

1.当i = 4k(k=1,2,3,4……)

字循环位移

对Wᵢ₋₁要做特殊处理,先把它向上循环平移一字节image-20250711091137983

S盒替换

然后掏出S-BOX

对十六进制数ab,就去找S-box中a行b列的元素,替换原本的元素image-20250711091331680

轮常量异或

再掏出Wᵢ₋₄和轮常量轮常量 Rcon (i/4) ,让它仨对应位置异或(即w[i] = w[i-1] ⊕ w[i-4] ⊕ Rcon (i/4)),得到的就是新的Wᵢimage-20250711091434845image-20250711091506968 ⨁ Rcon (i/4) = ?

2.当i ≠ 4k

直接让w[i] = w[i-1] ⊕ w[i-4]

也就是说我们正常情况下,生成一轮密钥需要一次情况1,三次情况2

最终我们需要再生成块轮密钥,共十一

之后我们将每块轮密钥称为RoundKey[i]

二、初始轮

仅执行轮密钥加(AddRoundKey

将明文块(state)与第一个轮密钥逐字节异或

1
State = State ⊕ RoundKey[0]

三、主轮

1. 字节替换(SubBytes

通过S盒对State中的每个字节进行替换

2.行移位(ShiftRows)

第一行循环左移0字节

第二行循环左移1字节

第三行循环左移2字节

第四行循环左移3字节

3.列混合(MixColumns)

首先声明列混合是在有限域GF(2⁸)上进行的

在这一步操作中。需要对State中的每一列进行有限域GF(2⁸)上的矩阵乘法

1
2
3
4
| b0 |   | 02 03 01 01 |   | a0 |
| b1 | = | 01 02 03 01 | × | a1 |
| b2 | | 01 01 02 03 | | a2 |
| b3 | | 03 01 01 02 | | a3 |

其中等号左侧[b0, b1, b2, b3]^T 是变换后的结果列

右侧[a0, a1, a2, a3]^T 是原始列的四个字节

右边矩阵是 AES 标准中固定的 4×4 矩阵,元素为 GF(28) 中的常量

有限域GF(2⁸)上的运算法则参照另一篇博客

我还没写,应该快了

4.轮密钥加(AddRoundKey)

State与当前轮的轮密钥逐字节异或。

1
State = State ⊕ RoundKey[i](i 为轮数)

四、最终轮

最终轮除了缺少列混合操作外,其余三步与主轮一致

最终加密流程可以表示为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
明文块(128位)

AddRoundKey(初始轮)

Round 1: SubBytes → ShiftRows → MixColumns → AddRoundKey

Round 2: SubBytes → ShiftRows → MixColumns → AddRoundKey

...

Round 9: SubBytes → ShiftRows → MixColumns → AddRoundKey

Round 10(最终轮): SubBytes → ShiftRows → AddRoundKey (无MixColumns)

密文块(128位)

AES-128解密流程

AES-128解密我们可以使用两种解密流程

应当注意两种解密流程解密时需要按逆序来使用轮密钥,从RoundKey10用到RoundKey0

密钥扩展

与加密过程相同,从128位密钥生成11个轮密钥

其他单步骤与加密过程的区别

  • 轮密钥加 (InvAddRoundKey)

将状态矩阵与轮密钥逐字节异或

再次强调使用轮密钥时应当倒着用,从RoundKey10用到RoundKey0

  • 逆列混合(InvMixColumns)

这里使用到了上文有限域GF(2⁸)中常量组成矩阵的逆矩阵

1
2
3
4
| b0 |   | 0E 0B 0D 09 |   | a0 |
| b1 | = | 09 0E 0B 0D | × | a1 |
| b2 | | 0D 09 0E 0B | | a2 |
| b3 | | 0B 0D 09 0E | | a3 |
  • 逆行移位(InvShiftRows)

移位的过程与行移位刚好相反

将第二、三、四行分别循环右移一定的字节,不再赘述

  • 逆字节替换(InvSubBytes)

使用S盒的逆映射替换每个字节

全部解密流程可以表示为以下两种

1.完全颠倒无脑型

具体体现为把加密过程完全反过来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
密文块(128位)

Round 10: AddRoundKey(k10) → ShiftRows⁻¹ → SubBytes⁻¹(无MixColumns⁻¹)


Round 9: AddRoundKey(k9) → MixColumns⁻¹ → ShiftRows⁻¹ → SubBytes⁻¹

Round 8: AddRoundKey(k8) → MixColumns⁻¹ → ShiftRows⁻¹ → SubBytes⁻¹

...

Round 1: AddRoundKey(k1) → MixColumns⁻¹ → ShiftRows⁻¹ → SubBytes⁻¹

AddRoundKey(k0)

明文块(128位)

2.主轮换序型

这种解密方式的特点是只有主轮的步骤顺序发生了变化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
密文块(128位)

AddRoundKey(初始轮使用k10)

Round 9: ShiftRows⁻¹ → SubBytes⁻¹ → AddRoundKey(k9) → MixColumns⁻¹

Round 8: ShiftRows⁻¹ → SubBytes⁻¹ → AddRoundKey(k8) → MixColumns⁻¹

...

Round 1: ShiftRows⁻¹ → SubBytes⁻¹ → AddRoundKey(k1) → MixColumns⁻¹

Round 0(最终轮): SubBytes⁻¹ → ShiftRows⁻¹ → AddRoundKey (无MixColumns,使用k0)

明文块(128位)

这两种解密流程是完全等价的