跳转至

分组密码总结

一、基本概念

块加密(即分组密码)是每次加密一块明文的对称加密算法。常见的加密算法有 IDEA、DES、AES。

块加密可以理解为一种特殊的替代密码,但每次替代一大块,明文空间巨大,必须有复杂的加解密算法。

两个关键辅助机制: - 填充 (Padding):将明文填充到指定分组长度。 - 分组加密模式:明文分组加密的方式。

二、设计策略

Shannon 提出的两大策略:

混淆 (Confusion)

将密文与密钥之间的统计关系变得尽可能复杂,使攻击者即使获取密文的统计特性也无法推测密钥。常见方法: - S 盒 - 乘法运算

扩散 (Diffusion)

使明文中的每一位影响密文中的许多位。常见方法: - 线性变换 - 置换 - 移位、循环移位

三、迭代结构

目前块加密主要使用迭代结构,便于设计与实现,同时方便安全性评估。

迭代结构

迭代结构包括三个部分: - 密钥置换(密钥扩展) - 轮加密函数 - 轮解密函数

轮函数设计方法

  • Feistel Network:由 Horst Feistel 发明(DES 的设计者之一),适用于 DES。
  • Substitution-Permutation Network (SPN):适用于 AES。
  • 其他方案。

密钥扩展

基本原则是使密钥的每一个比特尽可能影响多轮的轮密钥。


四、DES

基本参数

  • 输入/输出:64 位
  • 密钥:64 位(实际使用 56 位,剩余 8 位废弃或作奇偶校验)
  • 结构:Feistel 迭代结构,16 轮迭代

加密流程

DES流程

每轮加密过程:

\[ L_{i+1} = R_i \]
\[ R_{i+1} = L_i \oplus F(R_i, K_i) \]

在最后的 Permutation 之前,密文为 \((R_{n+1}, L_{n+1})\)。

解密流程

解密时使用相同的逻辑,只是密钥顺序相反:

\[ R_i = L_{i+1} \]
\[ L_i = R_{i+1} \oplus F(L_{i+1}, K_i) \]

核心部件

  • 初始置换
  • F 函数:
  • E 扩展函数
  • S 盒(设计标准未公开)
  • P 置换
  • 最后置换

F函数

衍生方案

双重 DES (2DES):使用两个密钥,长度 112 位。

\[ C = E_{k_2}(E_{k_1}(P)) \]

⚠ 双重 DES 不能抵抗中间相遇攻击。分别枚举 \(k_1\) 加密 P 和 \(k_2\) 解密 C,在中间匹配。

三重 DES (3DES):

\[ C = E_{k_3}(D_{k_2}(E_{k_1}(P))) \]

密钥选择: - 3 个不同密钥:168 位 - 2 个不同密钥(\(k_3 = k_1\)):112 位

攻击方法

  • 差分攻击
  • 线性攻击

五、AES

基本参数

  • 输入/输出:128 位
  • 结构:SPN 网络结构
  • 由 Joan Daemen 和 Vincent Rijmen 设计

轮数与密钥长度的关系:

密钥长度(位) 迭代轮数
128 10
192 12
256 14

块与 State 的转换

块与State

块中的字节按**列排列**进入状态数组。

加解密过程

AES加解密全图

每轮包含四个操作:

  1. 轮密钥加 (AddRoundKey):状态矩阵与轮密钥逐字节异或。
  2. 字节替换 (SubBytes):通过 S 盒(定义在 \(GF(2^8)\) 中)进行非线性替换。

字节替换

  1. 行移位 (ShiftRows):状态矩阵的每一行循环左移不同偏移量。
  2. 列混淆 (MixColumns):状态矩阵的每一列在 \(GF(2^8)\) 上与固定多项式矩阵相乘,使用的模多项式为 \(x^8 + x^4 + x^3 + 1\)。

列混淆

等价解密算法

  • 交换逆向行移位和逆向字节代替不影响结果。
  • 交换轮密钥加和逆向列混淆不影响结果(异或可视为域上多项式加法,乘法对加法有分配率)。

密钥扩展

密钥扩展

攻击方法

  • 积分攻击