【密码学】DES 介绍(转载)_描述des的加密思想和f函数-程序员宅基地

技术标签: Powered by 金山文档  源代码管理  

文章目录

一、DES 简介

二、DES 算法入口参数

三、DES 算法框架

1. 子密钥生成

2. 迭代加密

3. 轮函数 F

四、DES 设计的基本原则:混淆和扩散

五、安全性

参考链接

一、DES 简介

DES:Data Encryption Standard(数据加密标准)

DES 是一种 对称密钥 的 块加密 算法。

谓之 “对称密钥”,是因为加密、解密用的密钥是一样的。

谓之 “块加密”,是因为这种算法把明文划分为很多个等长的块(block),对每个块进行加密,最后以某种手段拼在一起。“块加密” 亦称 “分组加密”。

DES 的功能是:给定一个 64 位的明文和一个 64 位的密钥,输出一个 64 位的密文。这个密文可以用相同的密钥解密。所谓“64位的密钥”,其实里面只有54位在起作用。剩余的位可以直接丢弃,或者当作奇偶校验位。

虽然 DES 一次只能加密 8 个字节,但我们只需要把明文划分成每 8 个字节一组的块,就可以实现任意长度明文的加密。如果明文长度不是 8 个字节的倍数,还得进行填充。现在流行的填充方式是 PKCS7 / PKCS5,都是很简单的思路,用于把任意长度的文本填充成 8 字节的倍数长,也能方便地恢复原文,这里不再赘述。此外,独立地对每个块加密,最后直接拼起来是不行的(这种方式称为“电子密码本”,ECB 模式。它会导致明文中重复的块,加密结果也重复,这对于图片之类的数据来说几乎是致命的)。这个问题我们将在以后的博文中探讨。

DES 有一个非常不平凡的性质——加密与解密算法几乎一模一样。这大大简化了软件和硬件的设计。写完了加密算法,给它加上一行(倒转子密钥的顺序),就是一个解密算法了。这将给我们的编程带来帮助。

二、DES 算法入口参数

DES 算法的入口参数有三个:Key、Data、Mode。

其中,Key 为 7 个字节共 56 位,是 DES 算法的工作 密钥;

Data 为 8 个字节 64 位,是要被加密或被解密的 数据;

Mode 为 DES 的 工作方式,有两种:加密或解密。

三、DES 算法框架

DES 算法是在 Feistel network (费斯妥网络)的基础上执行的。以下是 DES 算法的流程图:

其中涉及的一些英语单词:permutation(置换)、cipher(密码)、rotation(旋转,转动,轮流,交替)

可以看到整个算法分为两大部分——迭代加密(左边的 16 轮迭代操作),以及 子密钥生成(右边生成子密钥的算法)。

1. 子密钥生成

所谓“子密钥生成”,就是从一把 64-bit 的主钥匙,得到 16 把 48-bit 的子钥匙,然后把这些子钥匙用于迭代加密。那么,如何从一把主钥匙得到 16 把子钥匙呢?

从 64-bit 的主钥匙里面选取特定的 56 位,其余的位就没用了。于是我们现在手上有了一个 56 位的布尔数组。把它分成左、右两个半密钥,它们都是 28-bit 的布尔数组。

左、右两个半密钥都左旋(也就是 循环左移 。整个数组往左移,左边弹出去了的东西补到最右边去)一定位数,这个左移的位数也是指定的。有些轮次是 1 位,有些轮次是 2 位。

把左、右半密钥拼起来,再做一个 置换 ,就得到了这一轮生成的子密钥。这个置换是从 56-bit 的数组里面选取指定的 48 位。所以现在每一轮都可以生成一个 48 位的子密钥。(注意,步骤 3 并不改变左右半密钥)。

重复 步骤 2、步骤 3 一共 16 次,于是得到了 16 个 48-bit 的子密钥。

2. 迭代加密

现在我们手上有了 16 把子密钥。遂开始加密:

输入的明文(长度为 64 的布尔数组)做一个置换(IP置换)。仍然得到 64-bit 的数组(不然就丢失信息了!)

把得到的数组拆成左、右两半边。每边是 32 位长度。

每一轮迭代,都是接收一组 L, R,返回 L', R' ,作为下一轮迭代的 L, R。迭代过程如下:

L' = R

R' = L ⊕ F(R,subkey)

1

2

其中 F 函数(称为轮函数)是整个算法的核心,功能是:以一个子密钥,加密 32-bit 的信息。

利用之前得到的 16 个子密钥,执行步骤 3 一共 16 次。

将最终的 R 与 L 拼接,再做一次置换(FP置换),这是IP的逆置换,即得到密文。注意到 FP 就是 IP 的逆函数。这是为了保证“加密、解密算法几乎完全相同”。

加密迭代的过程:先把信息进行一次初始置换(IP置换);再进行 16 轮迭代;最后再给 (R+L) 这个数组来一次最终置换(FP置换),即可输出作为密文。

以上就是整个 DES 算法的加密过程。而解密过程与加密过程几乎一致,唯一的不同之处是:解密过程中子密钥的使用顺序,是与加密过程使用子密钥的顺序相反的。

好了,DES的整个过程我们都知道了,其中唯一还不知道的是轮函数F的细节,接下来讲。

3. 轮函数 F

IP 和 FP 都是简单置换,对于密码安全没有任何意义,这是一个历史遗留原因。

DES 的安全性在很大程度上取决于 F 函数,也就是轮函数。那么 Feistel 函数是干了什么事呢?来看下面一张流程图:

一个 32-bit 的块,经过一个扩张(Expand函数),变成 48 位,然后与子密钥异或。得到的 48-bit 的结果分为 8 组,每一组是 6-bit 的数据,丢进对应的 S 盒,输出 4-bit 的信息。把这些输出收集起来,一共是 4*8 = 32 位,做一次置换 (P 置换),得到 32-bit 的结果。这与输进来的 32-bit 信息是等长度的。

Expand 算法是指定的,P 置换是一个简单置换,因此都是 encode 过程。而这个 32-bit 的半块与 subkey 的混合过程,以及 S 盒提供的强有力的混淆能力,提供了 DES 体系的核心安全性。

需要注意一点:这个 P 置换是精心设计的,使得这一轮同一个 S 盒 输出的四个 bit,在下一回合的扩张之后,交由四个不同的 S 盒去处理。

接下来唯一要处理的就是 S 盒了。它一共有 8 张表,表长成下面这个样子:

什么意思呢?扩张之后的半块与子密钥异或之后,得到了 48 位结果;这些结果分成 8 个组,然后第一组使用 S1 这张表进行变换,第二组使用 S2 进行变换……依次类推。

例:

现在我们假设第二组是 101100 ,来看它在 S盒变换之后会得到什么结果:

由于这是第二组,故查询 S2 表。

它的首位、末尾是 10 ,故查询第三行(1yyyy0行)。

它的中间 4 位是 0110 ,查表知结果是13

把 13 转为二进制,得到 1101 ,于是这就是输出。

到此为止,我们完整实现了 F 函数。有一个很有趣的事实——利用同一个子密钥,连续做两次 goRound ,等于什么也没做。

同样的迭代循环,以特定方式连续做两次,等于什么也没做!这就是 DES 加密、解密算法几乎一致的原因所在。把加密、解密的流程图上下拼在一起,中间就会像消消乐一样不停地抵消(解密与加密使用 subkey 的顺序恰好是反的,所以最中间的两个操作会相互抵消),直到最后变得什么改变也没有——因此,这个解密做法是正确的。

四、DES 设计的基本原则:混淆和扩散

DES 设计中使用了 分组密码 设计的两个原则:混淆(confusion)和 扩散 (diffusion),其目的是抗击敌手对密码系统的统计分析。

1945年,Shannon 提出了设计密码体制的两种基本方法——混淆(confusion)、扩散(diffusion)。

混淆: 使密文与密钥之间的关系变得复杂。

本博客之前讨论过“维吉尼亚密码”的分析密钥长度攻击。它是利用了密文的一些统计学特征,来推测出密钥的长度。一个优秀的密码系统,应该很难通过几组密文推断出密钥的特征。

扩散:使明文与密文的关系变得复杂。 常常体现为:明文的任何一个bit的变动,都会对密文产生翻天覆地的变化。

我们之前讨论过针对Many-Time-Pad的攻击。这种攻击就是利用了“明文的异或等于密文的异或”这种特征,使得攻击者轻易地得到了明文的大量统计信息,帮助攻击者攻破密码体系。

扩散的作用就是将每一位明文的影响尽可能迅速地作用到较多的输出密文位中,以便在大量的密文中消除明文的统计结构,并且使每一位密钥的影响尽可能迅速地扩展到较多的密文位中,以防对密钥进行逐段破译。

在实践上,一些非线性的操作可以实现“混淆”。例如乘法(乘法对二进制位有很复杂的改变。回顾一下学《数字逻辑》的时候,一个乘法器需要大量的逻辑门才能实现)、S盒(Substitution-box,替换盒。就是一个特定的函数,其映射关系是精心设计以对抗攻击的)。DES 体系在轮函数中采用了 S-box。

至于对“扩散”的实现,一般采用线性变换、置换、循环移位等手段。多次迭代可以大大增强混淆和扩散的强度,使密文、明文、密钥之间的关系异常复杂,以至于攻击者极其难以分析。

五、安全性

算法的安全性依赖于密钥的保密程度。(Kerckhoffs’s principle,柯克霍夫原则)

柯克霍夫原则要求,一个加密方案的安全性,仅取决于密钥的安全性,而不取决于算法的秘密。接受 Kerckhoffs 原则会带来很多好处:

首先,由于加密算法是公开的,通讯各方只需要保密密钥(这显然比加密算法要短,按常理来讲,越短的东西越容易保密)。

另外,如果密钥泄露了,双方只需要改个新的密钥就能继续安全通信(若不遵循 Kerckhoffs 原则,一旦泄露算法就需要重新设计加密方案)。

最后,遵循 Kerckhoffs 原则可以带来标准化的好处:多人通讯时,可以采用相同的算法而选择不同的密钥,这样程序可以复用。

参考链接

https://baike.baidu.com/item/DES/210508

DES算法原理及实现

————————————————

版权声明:本文为CSDN博主「想变厉害的大白菜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_44211968/article/details/126543433

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/shsh1234567890/article/details/128761822

智能推荐

Altium Designer 从导入DXF文件,并转换成板框_ad24导入的孔怎么转换为板框的孔-程序员宅基地

文章浏览阅读7.4k次,点赞2次,收藏5次。http://www.cnblogs.com/craftor/archive/2012/06/28/2567259.html大多数人都知道,PADS中导入DXF文件,然后转换成板框,是很方便的。AD也同样可以做到。PADS导入DXF见:http://www.cnblogs.com/craftor/archive/2012/01/14/2322446.html 1_ad24导入的孔怎么转换为板框的孔

【Elasticsearch】es 写入 忽略 错误字段 存储正确字段 ignore_malformed_es 查询时忽略格式不正确的ip-程序员宅基地

文章浏览阅读1.6k次。1.概述官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/ignore-malformed.html#ignore-malformed我们经常碰到一些内容不规范或者格式不对的数据,例如某个IP字段的里出现"UNKNOWN",某个数字字段出现"-"。如果在这些字段上已经设置了明确的类型,比如"ip"或者"float",字段中出现了非该类型的值,ES会抛出异常并丢弃整条数据。我们可以在该字段上设置"ignore_malf._es 查询时忽略格式不正确的ip

Spring 基于SSM框架,BaseDao --> dao层的抽取优化_优化ssm项目的dao层-程序员宅基地

文章浏览阅读1.9k次。通常来说,在一个项目中我们会使用到多个dao,比如在一个信息管理系统中,有 UserDao/ MessageDao等; 每个 dao 都有相同的 CRUD 代码,每个 dao 去写也是可以的,但是代码量会偏多,代码结构不够好,显得比较臃肿;实际上可以通过泛型来抽取出一个 BaseDao,这个 BaseDao 包含了各个 dao 的增删改查代码,创建新的 dao 时继承BaseDao,就可以减少很_优化ssm项目的dao层

自动整理html书签,Bookmarks Organizer - Chrome书签整理排序-程序员宅基地

文章浏览阅读1.7k次。Bookmarks Organizer Chrome开发背景很多人都会随手保存书签方便下次使用,但你书签保存多了就知道什么叫做灾难了,很多的书签、还有一些是重复或者链接失效的书签,找起来特别麻烦,书签太多,不好管理怎么办?Bookmarks Organizer帮助你管理你的书签。Bookmarks Organizer有适用于Chrome浏览器和firefox浏览器两种,虽然名字相同,而且同样是管理..._bookmarks organizer

SDN+DPI文献阅读-程序员宅基地

文章浏览阅读112次。MultiClassifier: A combination of DPI and ML for application-layer classification in SDN来源:International Conference on Systems and Informatics发表时间:2014针对问题在传统校园网络中,应用层分类是通过支持应用层分类的特定设备(防火墙)来实现,但是..._sdn引用文献

Unity体感应用开发——Kinect V2 抠像_unity kinect抠像-程序员宅基地

文章浏览阅读3k次,点赞5次,收藏9次。硬件、SDK、插件准备见这个文章:Unity体感应用开发——Kinect V2 获取彩色摄像头数据抠像,英文叫BackgroundRemoval。即背景移除。在SDK Browser的demo里面叫Coordinate Mapping,即坐标映射。从名字可以看出它的目的和原理,目的就是将图像中的人物与背景分离,将人物图像剥离出来。实现的原理就是将BodyIndexImage(一个512..._unity kinect抠像

随便推点

swagger3 设置值可以为空_【Swagger2】【3】API注解详解,以及注解常用参数配置-程序员宅基地

文章浏览阅读370次。前言:@Api,@ApiOperation,@ApiImplicitParam,@ApiModelProperty,@ApiIgnore正文:一,Controller层@ApiIgnore@CrossOrigin(origins= "*")@RestController@Api(tags= {"文章接口"})public classArticleController {@ApiIgnore@Api..._io.swagger.v3.oas @apiignore

python stdout stderr 一起输出_关于python:您可以愚弄isatty并分别记录stdout和stderr吗?...-程序员宅基地

文章浏览阅读344次。问题因此,您想(分别)记录一个进程或子进程的stdout和stderr,如果您未记录任何内容,则输出不会与在终端中看到的输出不同。似乎很简单,不是吗?不幸的是,似乎不可能为这个问题写一个通用的解决方案,该解决方案适用于任何给定的流程...背景管道重定向是一种分离stdout和stderr的方法,允许您分别记录它们。不幸的是,如果将stdout / err更改为管道,则该过程可能会检测到该管道不是t..._subprocess.popen stdout和stderr定向到同一输出

jQuery学习点滴_"$(\"p\").css(\"color\")"-程序员宅基地

文章浏览阅读2.1k次。jQuery学习点滴   在学习之余对jquery提供的方法进行分类总结,下文有些抄摘w3cschool,只为以后使用起来方便查找!jQuery 语法jQuery 语法是为 HTML 元素的选取编制的,可以对元素执行某些操作。基础语法是:$(selector).action()美元符号定义 jQuery 选择符(selector)“查询”和“查找” HTML 元素 jQ_"$(\"p\").css(\"color\")"

android security模块,Android security-crypto 库使用-程序员宅基地

文章浏览阅读675次。Note: 只支持Android 6.0 以上dependencies {def security_version = "1.0.0-alpha02"implementation "androidx.security:security-crypto:$security_version"}文件内容操作e.g : 文件写入private fun writeFile(){val key = Master..._androidx.security:security-cypto

[Androd] Gradle 使用技巧之模块依赖替换_dependencysubstitution-程序员宅基地

文章浏览阅读516次。我们在多模块项目开发过程中,会遇到这样的场景,工程里依赖了一个自己的或者其他同事的 模块,有时候为了开发调试方便,经常会把 改为本地源码依赖,开发完毕并提交的时候,会再修改回 依赖,这样就会很不方便,开发流程图示如下:一开始我们通过在 的 里的 判断如果是需要本地依赖的 ,就替换为 依赖,伪代码如下:这样就可以不用每次提交代码还要修改回 依赖,但是如果其他模块如果也依赖了该 模块,就会出现问题,虽然可以继续修改其他模块里的依赖方式,但是这样就会有侵入性,而且不能彻底解决问题,仍然有可能出_dependencysubstitution

corn表达式详解_corn下午2点如何表达-程序员宅基地

文章浏览阅读3.2k次。cornexpression表达式详解:1、格式cron一共有7位,但是最后一位是年,可以留空,所以我们可以写6位:字段允许值允许特殊字符秒0-59, - * /分0-59, - * /小时0-23, - * /日1-31, - * ? / L W C月1-12或JAN-DEC, - * /周1-7或SUN-SAT,..._corn下午2点如何表达