任何人都可以简单地解释 Feistal 分组密码是如何工作的。我不是数学系的学生,所以我不了解其背后的数学原理,只是想了解其中的原理。
Feistel 分组密码
密码学至少是数学的一半,所以如果你想了解密码学,你必须在某些时候使用一些数学知识。然而,对于 Feistel 方案的具体情况,数学并不难。
块密码应该将一个数据块(n位序列)转换为另一个相同大小的块,例如:
- 变换是通过一些(秘密)值(key)的知识来参数化的;
- 使用密钥,很容易计算变换及其逆;
- 没有钥匙,好吧,运气不好。
Hans Feistel 设计了一种构建块密码的通用方法。也就是说,密码将由几轮的应用组成,每一轮看起来像这样:
- 您将输入块分成两半,我们称它们为L(作为“左”)和R(“右”)。通常,您会进行偶数拆分(两半的长度为n/2位),但这不是绝对必要的。
- 您计算一个值S ,它是R和键K一起“修改”的结果。修改的细节是整体安全性隐藏的地方,并且不是“Feistel 结构”本身的一部分:Feistel 描述了整体设计,而不是精确的分组密码。粗略地说,重整应该在整个地方传播R和K的位,并且应该取决于轮数。值S必须与L具有相同的大小。
- 您将值R'计算为等于L xor S。“ xor ”是按位“异或”组合。“按位”是指L的第一位与S的第一位组合,产生R'的第一位;然后将L的第二位与S的第二位组合,产生R'的第二位;等等。如果两个位相等,则两个位的“异或”为0 ,否则为1。
- 您将值L'定义为等于R。
- 该轮的输出是L'和R'的串联,按此顺序。
简单来说,Feistel 轮包括将数据的左半部分与从右半部分和键的组合中导出的值进行异或运算,然后交换左右半部分。Feistel ciphers的维基百科文章有一些很好的图表。
该结构的全部要点是,如果您知道密钥,则计算逆变换(这意味着“解密”)很容易。这是有一些数学的地方:
- 对于所有a,b和c,如果a xor b = c那么a = b xor c
- 对于所有a和b,a xor b = b xor a
(用位值写下来,只有八种组合,所以很容易看出它是有效的)。因此,如果您有L'和R'以及密钥K,那么您就有R(L'等于R);从R和K你可以再次进行修改,并获得S。由于R' = L xor S,您可以将其重写为:L = R' xor S。换句话说,给定一轮的输出( L'和R')和密钥K,您可以再次运行 mangling 部分,并且,使用简单的xor,重新计算轮输入(L和R)。
那时你就有了 Feistel 方案。当您想知道如何进行修改以及您将使用多少轮时,事情变得复杂(从密码学上讲)。DES是一个众所周知的标准,它使用 Feistel 方案,64 位块,64 位密钥,16 轮(在 64 位密钥上,实际只使用了 56 位,所以通常说密钥的长度为 56 ,而不是 64)。“三重 DES ”,由三个连续的 DES 加密(使用不同的密钥!)组成,可以看作是 48 轮的 Feistel 方案。
Luby 和 Rackoff 在 1988 年表明,如果您使用足够宽的块(例如 256 位或更多)并且处理步骤包含在类似随机预言机的函数中(在此处考虑“理想哈希函数”),那么 4 轮就足以实现最终安全; 然而,构建一个“类似随机预言的函数”是困难的(实际上,比构建一个足够安全的 mangling 更难),如果你用现有的散列函数构建一个分组密码,性能很可能很差(散列函数是快速处理长时间运行的数据,但这里我们讨论的是每个加密块的小数据元素上的四个哈希函数调用)。
最值得注意的是,当前推荐的标准分组密码AES 不是Feistel分组密码。