4.3 DES 的 Feistel 结构
很多(但不是全部)现代分组密码都使用了 Feistel 网络(实际上,AES 不是 Feistel 密码)。除了潜在的密码学强度外,Feistel 网络的另一个优势就是它的加密过程和解密过程几乎完全相同。DES 的解密仅需要一个逆向密钥编排,这在软件和硬件上都是一个优势。下面是DES 的 Feistel 结构图:
将 64 位的明文 x 进行初始按位置置换 IP 后,此明文会被分成L_0和R_0两部分;然后将得到的 32 位的左右两部分输入到 Feistel 网络,而 Feistel 网络包含 16 轮操作。右半部分R_i将被送入函数 f 中,f 函数的输出将与 32 位的左半部分L_i进行 XOR。最后,左右两部分进行交换。后面的每轮都重复这个过程,可以表示为:
L_i = R_{i-1} R_i = L_{i-1}\oplus f(R_{i-1}, k_{i})
其中 i = 1,…,16。经过 16 轮后,均为 32 位的左半部分L_{16}和右半部分R_{16}将再次交换,逆初始置换IP^{-1}是 DES 的最后一步操作。逆初始置换IP^{-1}是初始置换IP的逆操作。每轮中的轮密钥k_i均来自 56 位主密钥,而这个过程则是通过密钥编排 [ Key schedule ] 实现的。
前面提到的密码必须具备的两个基本属性,即扩散和混淆,都是在 f 函数内实现的。为了抵抗高级的分析攻击,设计 f 函数时必须十分小心。如果 f 函数的设计非常安全,Feistel 密码的安全性也会随着密钥位数和轮数的增加而增强。
每轮中使用的 Feistel 结构都将一个 64 位的输入分组双射映射到一个 64 位的输出分组(即每个可能的输入都唯一地映射到一个输出,反之亦然)。对任意函数 f 而言,即使 f 本身不是双向映射的这个映射仍然是双向映射。在 DES 中,f 函数实际上是一个满射(多对一的映射),它使用了非线性的基本构造分组,并使用 48 位轮密码 k_i(1\leq i\leq16)将 32 位的输入映射到 32 位的输出。