关于密码学:密码学系列之feistel-cipher

8次阅读

共计 1447 个字符,预计需要花费 4 分钟才能阅读完成。

简介

feistel cipher 也叫做 Luby–Rackoff 分组明码,是用来构建分组加密算法的对称构造。它是由德籍明码学家 Horst Feistel 在 IBM 工作的时候创造的。feistel cipher 也被称为 Feistel 网络。

很多分组加密算法都是在 feistel cipher 的根底上倒退起来的,比方十分有名的 DES 算法。

在 feistel cipher 中,加密和解密的操作十分类似,通常须要进行多轮加密和解密操作。

Feistel 网络的原理

Feistel 网络中会用到一个 round function 也叫做轮函数,这个函数接管两个输出参数,别离是分组数据(原始数据的一半)和子 key,而后生成和分组数据同样长度的数据。

而后应用上一轮生成的数据和原始数据的另一半进行 XOR 异或操作,作为下一轮轮函数的输出。

就这样一轮一轮进行上来最初生成加密过后的数据。

解密的流程和加密的流程是相似的,只不过把加密的操作反过来。

Feistel 网络的轮数能够任意减少。不管多少轮都能够失常解密。

解密与轮函数 f 无关,轮函数 f 也不须要有逆函数。轮函数能够设计得足够复制。

加密和解密能够应用完全相同的构造来实现。从下面咱们讲到的能够看到,加密和解密其实是没有什么区别的。

Feistel 网络的例子

咱们用一个图的形式来介绍一下 Feistel 的工作流程:

上图中 F 示意的就是 round function 也就是轮函数。

K0,K1,K2…,Kn示意的是子 key,别离作为各轮的输出。

原始数据被分成了左右两边相等的局部,(L0,R0)

每一轮都会进行上面的操作:

  • Li+1 = Ri
  • Ri+1 = Li XOR F(Ri,Ki)

最初的加密出的后果就是(Ri+1,Li+1)

解密的过程是加密过程的逆序,每一轮解密都会进行上面的操作:

  • Ri = Li+1
  • Li = Ri+1 XOR F(Li+1,Ki)

最终失去咱们的原始数据(R0,L0)

Feistel 网络的实践钻研

Michael Luby 和 Charles Rackoff 证实了如果轮函数是应用 K i为种子的明码平安的伪随机函数,那么通过三轮操作之后,生成的分组明码就曾经是伪随机排列了。通过四轮操作能够生成“强”伪随机排列。

什么是伪随机数呢?

考虑一下如果在计算机中生成随机数,因为计算机中的数据是由 0 和 1 组成的,所有的数据都是确定的,要么是 0 要么是 1,所以计算机程序并不能生成真正的随机数。

如果要让计算机来生成随机数,通常的做法就是将输出通过肯定的算法函数进行计算,从而失去解决过后的数字。

如果这个算法函数是确定的,也就是说同样的输出能够失去同样的输入,那么这个数就不是随机产生的,这个数就被称为伪随机数。

伪随机数是用确定性的算法计算出来自 [0,1] 均匀分布的随机数序列。并不真正的随机,但具备相似于随机数的统计特色,如平均性、独立性等。

因为 Luby 和 Rackoff 的钻研十分重要,所以 Feistel 明码也称为 Luby–Rackoff 明码。

Feistel 网络的拓展

除了咱们之前介绍过的 DES 之外,很多算法都用到了 Feistel 网络结构,比方 Blowfish,Twofish 等等。

因为 Feistel 网络的对称性质和简略的操作,使得通过硬件的形式来实现 Feistel 网络变得非常简单,所以 Feistel 网络的利用十分的宽泛。

本文已收录于 http://www.flydean.com/feistel-cipher/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!

正文完
 0