这篇文章上次修改于 221 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

加密流程

AES 是一个分组密码,每组 16 bytes,即 128 bit(也有 256 bit 的,不过 128 bit 的安全性就足够了)

24.png

  1. 将 128 bit 的明文写为 $4*4$ 的矩阵 $M_0$,将 128 bit 密钥写为 $4*4$ 的矩阵 $K_0$
  2. $K_0$ 通过密钥扩展算法扩展出新的密钥矩阵 $K_1, K_2, ..., K_{10}$
  3. $M_0$ 与 $K_0$ 进行 1 轮 xor 运算,得到新的矩阵 $M_1$
  4. $M_1$ 进行 4 轮( 最后一轮是与 $K_1$ 的 xor)的轮函数运算后得到新的矩阵 $M_2$
  5. 将步骤 4 重复 9 遍,得到矩阵 $M_{10}$
  6. 将 $M_{10}$ 进行 3 轮(最后一轮是与 $K_{10}$ 的 xor)的轮函数运算后得最终矩阵 $M_{11}$
  7. 将 $M_{11}$ 由矩阵形式写为向量形式,得到最终的密文

所以轮函数和密钥扩展函数是 AES 的关键部分

解密流程

解密算法的操作顺序正好与加密算法相反,且每一步对应加密算法的逆操作。加解密中每轮的密钥分别由种子密钥经过密钥扩展算法得到。

25.png

轮函数

轮函数包含 4 种操作:字节替换,行移位,列混淆,轮密钥加

字节替换

是非线性变换,可抵抗解方程组攻击、延展攻击。延展性:基于已有密文计算新的密文,例如同态加密具有延展性。

字节代替通过 $S$ 盒完成一个字节到另外一个字节的映射。$S$ 盒用于提供密码算法的混淆性。

$S$ 和 $S^{-1}$ 分别为 16x16 的矩阵,输入的高 4-bit 对应的值作为行标,低 4-bit 对应的值作为列标,可在 $S$ 或 $S^{-1}$ 中找到新的 8-bit 数据作为输出。

行移位

行移位是一个 4x4 的矩阵内部字节之间的置换,用于提供算法的扩散性。

加密:第一行保持不变,第二行循环左移 8 比特,第三行循环左移 16 比特,第四行循环左移 24 比特。

解密:第一行保持不变,第二行循环右移 8 比特,第三行循环右移 16 比特,第四行循环右移 24 比特。

列混淆

计算方式一:使用域 $F_{2^8}$ 上的不可约多项式 $m(x) = x^8 + x^4 + x^3 + x +1$

例如

$$ \begin{align} \left\{02\right\} \cdot \left\{C9\right\} &= (0000,00010) \cdot (1100,1001) \\ &= x \cdot (x^7 + x^6 + x^3 + 1) mod (m(x))\\ &= x^7 + x^3 + 1 = (1000, 1001) = \left\{89\right\} \end{align} $$

计算方式二:左乘矩阵 $\begin{bmatrix} 02 & 03 & 01 & 01 \\ 01 & 02 & 03 & 01 \\ 01 & 01 & 02 & 03 \\ 03 & 01 & 01 & 02 \end{bmatrix} $

(1) 将某个字节所对应的值乘以 2,其结果就是将该值的二进制位左移一位。 如果原始值的最高位为 1,则还需要将移位后的结果异或常量 00011011

(2)乘法对加法满足分配率 $07·S_{0,0}=(01⊕02⊕04)·S_{0,0}=( 01·S_{0,0})⊕ (02·S_{0,0}) ⊕(04·S_{0,0}) $

(3)加法是模 $2^8$ 加法(异或运算)。

逆向列混淆:左乘矩阵 $\begin{bmatrix} 0E & 0B & 0D & 09 \\ 09 & 0E & 0B & 0D \\ 0D & 09 & 0E & 0B \\ 0B & 0D & 09 & 0E \end{bmatrix} $

AES 加密计算复杂度更低,AES 解密计算复杂度更高。因为 CFB/OFB/CTR 模式仅用到加密算法生成随机数,没有用到解密算法。

轮密钥加

加密:每轮的输入与轮子密钥异或一次,c=m⊕k

解密::再异或上该轮的轮子密钥即可恢复明文,m=c⊕k

密钥扩展算法

26.png

  • 将种子密钥按图 (a) 的格式排列,$k_0, k_1, ..., k_{15}$ 依次表示种子密钥的一个字节。排列后用 4 个 32 比特的字表示,记为 $w_0, w_1, w_2, w_3$,每组 4 个字节
  • 串行求解 $w_j$,其中 $j \in [4,43]$

    • 如果 $j \space mod \space 4=0$,则 $w_j=w_{j-4} \bigoplus g(w_{j-1})$
    • 否则,$w_j=w_{j-4} \bigoplus w_{j-1}$

    g(x) 如图 (b) 所示

    • $w$ 循环左移 8 比特
    • 分别对每个字节做 S 盒置换
    • 与 32 比特的常量(RC[j/4],0,0,0)进行异或

      RC 是一个有 10 个元素的一维数组:01, 02, 04, 08, 10, 20, 40, 80, 1B, 36

分组密码每次加密 128bit 的数据,如果数据为 128bit~300Gbit 数据,则将分组密码循环调用多次。

对称加密的五种工作模式

ECB 电码本模式

用相同的密钥分别对明文分组独立加密。

优点:可并行加密和解密

缺点:如果明文 $P_1=P_2$,则密文 $C_1=C_2$,随机性很差

应用场景:仅加密 128-bit 的数据

CBC 密文分组链接模式

明文块 $P_1$ 先与初始向量 IV 做异或运算,再加密得到密文块 $C_1$。剩下的明文块 $P_i$ 加密前,必须与前一个密文块 $C_1$ 做一次 xor 运算再加密。最后一个分组需要填充。

27.png

优点:随机性高

缺点:

  • 1bit 传输错误,会影响后续解密,称为雪崩效应
  • 串行加密

应用场景:数据本地加解密,且数据量较小(或对速度无要求)

CFB 密文反馈模式

用密钥 $K$ 对初始向量 $IV$ 加密,产生 128-bit 随机数,选择其中的 s-bit 与 s-bit 的明文数据块 $P_1$ 进行 xor 运算,得到密文块 $C_1$。将 $C_1$ 放到移位寄存器的尾部,移位后,再用 $K$ 对其加密,...。不需要填充。

28.png

优点:加密和解密都用的是 AES 加密算法,效率高

缺点:

  • 1bit 传输错误,会影响后续解密
  • 串行加密,且每次只加密 s-bit 明文

OFB 输出反馈模式

选择一个保密的 Nonce,用密钥 $K$ 对 Nonce 加密得到新的随机数 $R_1$,$R_1$ 与明文块 $P_1$ 异或得到密文块 $C_1$,再用 $K$ 加密 $C_1$,...。不需要填充。本质上是分组密码算法构造出流密码算法,生成任意长的随机数对消息加密。

30.png

优点:加密和解密都用的是 AES 加密算法,效率高

缺点:串行加解密

CTR 计数器模式

相对于 OFB 模式,用一个公开的 Counter1 = IV 代替了保密的 Nonce,Counter2 = Counter1 + 1

29.png

优点:

  • 独立性高,可并行加解密
  • 加密和解密都用的是 AES 加密算法,效率高

对比分析和应用场景

模式优点缺点备注
ECB支持并发加解密重复明文反映在密文中,不能抵抗重放攻击不推荐
CBC抵抗重放攻击,可并行解密不能并行加密,错误的密文影响后续密文解密推荐
CFB不需要填充,可并行解密,解密分组间无依赖不能并行加密,,错误的密文影响后续密文解密不推荐
OFB不需要填充,出现错误时仅对应明文出错不支持并行计算不推荐
CTR不需要填充,可并行加解密反转密文分组中的部分 bit 时,对应明文也会反转推荐

GCM 加密模式

GCM 是认证加密模式,目前最推荐的加密模式!GCM = MAC + CTR

MAC:提供附加消息的完整性校验

CTR:确保数据的保密性,有并行性、counter=IV 可公开等优点

双方提前共享一个密钥,发送者使用共享密钥和数据计算哈希值,并随消息一起发送。 接收者通过共享密钥计算收到消息的 MAC 值,与接收的 MAC 值做比较,从而判断消息 是否被改过(完整性)。对于篡改者,由于没有密钥(认证),也就无法对篡改后的消息计算 MAC 值。

参考

【新火公开课】密码学基础系列课程1: 对称加密与哈希函数