Feistel 分组密码

Feistel 密码不是分组密码的特定方案。 它是一个设计模型,许多不同的分组密码都从中衍生出来。 DES 只是 Feistel 密码的一个示例。 基于Feistel密码结构的密码系统采用相同的加密和解密算法。

加密过程

加密过程采用由多轮组成的 Feistel 结构 明文的处理,每一轮都包含一个"替换"步骤,然后是一个排列步骤。

Feistel 结构如下图所示−

Feistel 结构
  • 每轮的输入块被分为两半,左半部分和右半部分可以表示为L和R。

  • 在每一轮中,块的右半部分 R 都保持不变。 但左半部分 L 会执行取决于 R 和加密密钥的操作。 首先,我们应用一个加密函数"f",它接受两个输入− 密钥 K 和 R。该函数产生输出 f(R,K)。 然后,我们将数学函数的输出与 L 进行异或。

  • 在 Feistel 密码(例如 DES)的实际实现中,不是在每一轮中使用整个加密密钥,而是从加密密钥中派生出与轮相关的密钥(子密钥)。 这意味着每轮使用不同的密钥,尽管所有这些子密钥都与原始密钥相关。

  • 每轮结束时的置换步骤会交换修改后的 L 和未修改的 R。因此,下一轮的 L 将是当前轮的 R。 下一轮的R是本轮的输出L。

  • 以上替换和排列步骤形成一个"回合"。 轮数由算法设计指定。

  • 最后一轮完成后,两个子块"R"和"L"按此顺序连接起来形成密文块。

设计 Feistel 密码的困难部分是轮函数"f"的选择。 为了成为牢不可破的方案,该函数需要具有几个重要的属性,这些属性超出了我们讨论的范围。

解密过程

Feistel 密码的解密过程几乎类似。 密文块不是从明文块开始,而是被馈送到 Feistel 结构的开头,然后此后的过程与给定插图中描述的完全相同。

据说这个过程几乎相似,但并不完全相同。 在解密的情况下,唯一的区别是加密中使用的子密钥以相反的顺序使用。

Feistel 密码最后一步中"L"和"R"的最终交换至关重要。 如果不交换这些内容,则无法使用相同的算法解密生成的密文。

轮次

Feistel 密码中使用的轮数取决于系统所需的安全性。 更多轮数提供更安全的系统。 但同时,更多的轮数意味着加密和解密过程效率低下、缓慢。 因此,系统中的轮数取决于效率与安全性的权衡。