简介
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 证实了如果轮函数是应用Ki为种子的明码平安的伪随机函数,那么通过三轮操作之后,生成的分组明码就曾经是伪随机排列了。通过四轮操作能够生成“强”伪随机排列。
什么是伪随机数呢?
考虑一下如果在计算机中生成随机数,因为计算机中的数据是由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/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢送关注我的公众号:「程序那些事」,懂技术,更懂你!