密码学系列之:feistel cipher

简介

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

不少分组加密算法都是在feistel cipher的基础上发展起来的,好比很是有名的DES算法。安全

在feistel cipher中,加密和解密的操做很是类似,一般须要进行多轮加密和解密操做。网络

Feistel网络的原理

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

而后使用上一轮生成的数据和原始数据的另外一半进行XOR异或操做,做为下一轮轮函数的输入。加密

就这样一轮一轮进行下去最后生成加密事后的数据。spa

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

Feistel网络的轮数能够任意增长。不论多少轮均可以正常解密。教程

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

加密和解密可使用彻底相同的结构来实现。从上面咱们讲到的能够看到,加密和解密实际上是没有什么区别的。ci

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/

最通俗的解读,最深入的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注个人公众号:「程序那些事」,懂技术,更懂你!