密码学系列之:feistel cipher
密码学系列之:feistel cipher
简介
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/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!
密码学系列之:feistel cipher的更多相关文章
- 密码学系列之:memory-hard函数
密码学系列之:memory-hard函数 目录 简介 为什么需要MHF Memory hard的评估方法 MHF的种类 MHF的密码学意义 memory-hard在MHF中的应用 简介 Memory ...
- 密码学系列之:碰撞抵御和碰撞攻击collision attack
密码学系列之:碰撞抵御和碰撞攻击collision attack 简介 hash是密码学和平时的程序中经常会用到的一个功能,如果hash算法设计的不好,会产生hash碰撞,甚至产生碰撞攻击. 今天和大 ...
- 密码学系列之:memory-bound函数
密码学系列之:memory-bound函数 目录 简介 内存函数 内存受限函数 内存受限函数的使用 简介 memory-bound函数可以称为内存受限函数,它是指完成给定计算问题的时间主要取决于保存工 ...
- 密码学系列之:Merkle–Damgård结构和长度延展攻击
密码学系列之:Merkle–Damgård结构和长度延展攻击 简介 Merkle–Damgård结构简称为MD结构,主要用在hash算法中抵御碰撞攻击.这个结构是一些优秀的hash算法,比如MD5,S ...
- <密码学系列>—信息安全威胁
懒惰等于将一个人活埋.--泰勒 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues. https://github.com/midou-tech/articles 点关注,不迷路! ...
- 密码学系列之:NIST和SHA算法
目录 简介 SHA1 SHA2 SHA3 简介 SHA算法大家应该都很熟悉了,它是一个用来计算hash的算法,目前的SHA算法有SHA1,SHA2和SHA3种.这三种算法都是由美国NIST制定的. N ...
- 密码学系列之:blowfish对称密钥分组算法
目录 简介 blowfish详解 密钥数组和S-box 密钥数组 S-box 生成最终的K数组 blowfish blowfish的应用 blowfish的缺点 简介 Blowfish是由Bruce ...
- 密码学系列之:1Password的加密基础PBKDF2
目录 简介 PBKDF2和PBKDF1 PBKDF2的工作流程 详解PBKDF2的key生成流程 HMAC密码碰撞 PBKDF2的缺点 总结 简介 1password是一个非常优秀的密码管理软件,有了 ...
- 密码学系列——常见的加密方式(c#代码实操)
前言 说起加密方式,其实密码学的角度ASCII编码其实本身就是一种加密解密. 由于其公开,现在用于数字与字符的转换. 查看ASCII表可以去官网查查. 转换代码如下: static void Main ...
随机推荐
- 详解 WebRTC 传输安全机制:一文读懂 DTLS 协议
作者|进学 审校|泰一 DTLS (Datagram Transport Layer Security) 基于 UDP 场景下数据包可能丢失或重新排序的现实情况下,为 UDP 定制和改进的 TLS 协 ...
- 【flutter学习】基础知识(一)
今天开始学习一下flutter 学习思路:首先由一个简单的例子引出每次学习的对象,一点一点加入元素,针对于代码去了解学习详细知识. 看完本篇博客能够快速的读懂flutter简单代码. flutter ...
- [花式栈溢出]栈上的 partial overwrite
[花式栈溢出]栈上的 partial overwrite 希望能在这几天对Pwn中的栈上的各种利用和其他一些较小的分支做一个收尾,以便全力投入学习堆的相关知识.初步计划是对照ctf-wiki查缺补漏. ...
- Mac TouchBar 自定义工具-MTMR
Github Install brew cask install mtmr 官网
- 【插件篇】前段bootstrap-table-treegrid试手,解决无法显示树形列表或者图标不显示问题。
说明:具体代码操作我就不贴了.官方有正规的例子!bootstrap-table-examples传送 使用注意事项: 传入的id和pid可以是string类型的(我后台返回的是Long类型转换成str ...
- TortoiseGit生成.PPK拓展名的密钥
在TortoiseGit 运行目录下找到puttygen.exe 工具 运行puttygen.exe genertate :代表动态生成新的内容 load :导入旧的密钥 save private k ...
- GitBash管理代码
一.Git是什么? Git是目前世界上最先进的分布式版本控制系统. 1.Git和SVN的区别 SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中 ...
- JS实现单例模式的多种方案
JS实现单例模式的多种方案 今天在复习设计模式中的-创建型模式,发现JS实现单例模式的方案有很多种,稍加总结了一下,列出了如下的6种方式与大家分享 大体上将内容分为了ES5(Function)与ES6 ...
- 2019c#将PDF转图片
两种方法: 第一种是用O2S.Components.PDFRender4NET 大家可以去网上查找无水印版本 但是有的时候带颜色的字就变空白了 不知道为什么 第二种是用PdfiumViewer 这种方 ...
- Java Arrays.sort()重写comparator方法
先看一下接口 Arrays.sort(T[],Comparator<? super T> c); comparator要重写compare方法 compare方法大概长这样,返回值> ...