密码学系列之: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的更多相关文章

  1. 密码学系列之:memory-hard函数

    密码学系列之:memory-hard函数 目录 简介 为什么需要MHF Memory hard的评估方法 MHF的种类 MHF的密码学意义 memory-hard在MHF中的应用 简介 Memory ...

  2. 密码学系列之:碰撞抵御和碰撞攻击collision attack

    密码学系列之:碰撞抵御和碰撞攻击collision attack 简介 hash是密码学和平时的程序中经常会用到的一个功能,如果hash算法设计的不好,会产生hash碰撞,甚至产生碰撞攻击. 今天和大 ...

  3. 密码学系列之:memory-bound函数

    密码学系列之:memory-bound函数 目录 简介 内存函数 内存受限函数 内存受限函数的使用 简介 memory-bound函数可以称为内存受限函数,它是指完成给定计算问题的时间主要取决于保存工 ...

  4. 密码学系列之:Merkle–Damgård结构和长度延展攻击

    密码学系列之:Merkle–Damgård结构和长度延展攻击 简介 Merkle–Damgård结构简称为MD结构,主要用在hash算法中抵御碰撞攻击.这个结构是一些优秀的hash算法,比如MD5,S ...

  5. <密码学系列>—信息安全威胁

    懒惰等于将一个人活埋.--泰勒 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues. https://github.com/midou-tech/articles 点关注,不迷路! ...

  6. 密码学系列之:NIST和SHA算法

    目录 简介 SHA1 SHA2 SHA3 简介 SHA算法大家应该都很熟悉了,它是一个用来计算hash的算法,目前的SHA算法有SHA1,SHA2和SHA3种.这三种算法都是由美国NIST制定的. N ...

  7. 密码学系列之:blowfish对称密钥分组算法

    目录 简介 blowfish详解 密钥数组和S-box 密钥数组 S-box 生成最终的K数组 blowfish blowfish的应用 blowfish的缺点 简介 Blowfish是由Bruce ...

  8. 密码学系列之:1Password的加密基础PBKDF2

    目录 简介 PBKDF2和PBKDF1 PBKDF2的工作流程 详解PBKDF2的key生成流程 HMAC密码碰撞 PBKDF2的缺点 总结 简介 1password是一个非常优秀的密码管理软件,有了 ...

  9. 密码学系列——常见的加密方式(c#代码实操)

    前言 说起加密方式,其实密码学的角度ASCII编码其实本身就是一种加密解密. 由于其公开,现在用于数字与字符的转换. 查看ASCII表可以去官网查查. 转换代码如下: static void Main ...

随机推荐

  1. [CTF]ACSII码

    [CTF]ACSII码 ----------转自百度百科 https://baike.baidu.com/item/ASCII/309296?fromtitle=ascii码&fromid=9 ...

  2. 如何在spring boot中从控制器返回一个html页面?

    项目截图 解决方法 我之前用的@RestController注解,而@RestController这个控制器返回数据而不是视图,改成@Controller 就好了(以下是修改后的) @Controll ...

  3. 【opencv】VideoCapture打不开本地视频文件或者网络IP摄像头

    1.前提:成功打开本地USB摄像头 // 创建VideoCapture对象 VideoCapture vc = new VideoCapture(); // 可以成功打开本地USB摄像头 // 参数可 ...

  4. 异常检测算法Robust Random Cut Forest(RRCF)关键定理引理证明

    摘要:RRCF是亚马逊发表的一篇异常检测算法,是对周志华孤立森林的改进.但是相比孤立森林,具有更为扎实的理论基础.文章的理论论证相对较为晦涩,且没给出详细的证明过程.本文不对该算法进行详尽的描述,仅对 ...

  5. 老Python带你从浅入深探究Tuple

    元组 Python中的元组容器序列(tuple)与列表容器序列(list)具有极大的相似之处,因此也常被称为不可变的列表. 但是两者之间也有很多的差距,元组侧重于数据的展示,而列表侧重于数据的存储与操 ...

  6. 使用BeanUtils.copyProperties踩坑经历

    1. 原始转换 提起对象转换,每个程序员都不陌生,比如项目中经常涉及到的DO.DTO.VO之间的转换,举个例子,假设现在有个OrderDTO,定义如下所示: public class OrderDTO ...

  7. 如何通过CRM解决公司业绩下滑的问题

    大部分公司都需要新客户的支持来维持市场和实现预期的目标.尽管销售部门一直在努力,但这种努力还是无法阻止业绩下降. 想要做到销售增长,不仅要取决企业的进步,还需要改掉使业绩下降的问题.小Z将从四个方面对 ...

  8. opencv——轮廓发现与轮廓(二值图像)分析

    引言 二值图像分析最常见的一个主要方式就是轮廓发现与轮廓分析,其中轮廓发现的目的是为轮廓分析做准备,经过轮廓分析我们可以得到轮廓各种有用的属性信息. 这里顺带提下边缘检测,和轮廓提取的区别: 边缘检测 ...

  9. Servlet-授课

    1 Servlet 1.1 Servlet概述 Servlet是SUN公司提供的一套规范,名称就叫Servlet规范,它也是JavaEE规范之一.我们可以像学习Java基础一样,通过API来学习Ser ...

  10. Ubuntu20.04 网络配置

    Ubuntu20.04 网络配置 设置 ROOT 密码 先设置 root 密码,后面直接使用 root 用户操作 it@it:~$ sudo passwd root [sudo] password f ...