上一篇讲到了密码学的定义和发展历史,讲到了一些基础理论如扩散(明文的一位可以影响密文的多位)和混淆(密钥和密文的对应关系复杂化),如信息安全系统三要素CIA(机密性、完整性、可用性)等,并简要的介绍了一下密码学的分类,可以根据明文处理方式分为序列密码和分组密码,也可以根据加解密密钥是否一致分为对称和非对称加密。下面先讲讲对称加密。

对称加密简介

如图所示,对称加密使用的加、解密密钥都是同一个,这也会导致它难以抵抗窃取和伪装等手段。但随着技术的发展,正如著名密码学家香农所提出的混淆、扩散概念,密钥和密文,明文和密文间的关系变得更加错综复杂,密钥长度也越来越长,对称加密的安全系数也越来越高。之后陆续出现了DES、3DES、AES等算法。

什么是DES

在介绍DES之前,先思考几个问题:

  1. 传统的密码字典、移位密码和替换密码存在哪些不足?
  2. 香农混淆、扩散概念如何应用于对称加解密使得其变得更安全?
  3. 如何设计一种模式使得即使在知道对称加密的密钥的情况下破译密文也是很困难的?

DES 全称Data Encryption Standard,翻译过来就是数据加密标准,是美国IBM公司研发的一种对称加密算法,也是一种分组密码。其明文按照每64位进行分组,初始密钥也是64位,(可以将每8位看成一组,每组的最后一位为校验码,不参与密钥生成过程,也就是说真正的子密钥长度为56位) 经过一系列的处理形成密文的一种方式,处理过程如下图所示:

——————————— 2022.12.29 更新 ---------------------------------------

DES加密实现步骤

STEP1 初始置换

从初始置换讲起,什么是初始置换?
初始置换是通过一个初始置换表对于明文进行字符的替换,如下图所示

比如明文为0123456789ABCDEF
则64位二进制明文为 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
再参照这个初始置换表,如初始置换表[0,0] 上的值为58,表示替换后第一位的位置为二进制明文的第58位位置,同理初始置换表[0,1]上的值为50,就将明文第50位的值替换进去,以此类推。
最后得出初始置换后的二进制明文为
1100 1100 0000 0000 1100 1100 1111 1111 1111 0000 1010 1010 1111 0000 1010 1010

为什么要先初始置换?初始置换有什么好处?
初始置换的目的是为了增加破解难度,只有拥有初始置换表的用户才能正确的对DES明文进行加密,对密文进行解密。而将其放在第一个环节则是为了降低破解的风险,增加破解的难度。体现了香农的混淆概念。

STEP2 将64位明文分成左32位和右32位明文

方便后续的16轮迭代运算,方便左右明文异或运算,可以将高位的信息融入低位,有点像hashmap的hash运算。

STEP3 16组密钥生成

子密钥生成过程:

  1. 将密钥文本输入转成二进制文本(共64位初始密钥)
  2. 通过选择置换PC-1将64位初始密钥转变为56为的子密钥,选择置换的目的是增加扩散并且可以置换掉多余的位数,方便后续的48位异或运算)
  3. 分成左右两组,每组28位
  4. 左右两组同时进行循环左移,(注意,第1、2、9、16 轮每次循环左移1位,其他轮数每次循环左移2位,一共向左循环左移28位,即左半组的长度)ps:循环左移例子:原先为10000001的循环左移后就变为00000011。
  5. 之后再次进行选择置换PC-2,将56位子密钥转为48位的输出。
  6. 重复步骤3-5 15次,生成16组密钥输出。

STEP4 16次的加密运算

————————————————注: 4.1-4.4 之后统称F函数运算———————————————————
4.1 扩展置换,将右半边的32位明文通过这种方式扩展成48位

方便后续与密钥的加密运算。(子密钥为56位,参与运算的为48位)
扩展置换也有个表,如图所示

从图中不难发现,第二列到第五列为原明文位,第一列和第六列为扩展列。
并且还发现,每一行的数值不重复,每一列也是。
扩展置换运算和初始置换类似,不过是增列了。
将原先的左32位明文 1100 1100 0000 0000 1100 1100 1111 1111
放入扩展运算表中得到: 1110 0101 1000 0000 0000 0000 0110 0101 1001 0111 1111 1111
格式化后为:
111001
011000
000000
000000
011001
011001
011111
111111
(方便后续的S盒运算理解)

4.2 按照次序将子密钥与右半边经过扩展置换的48位进行加密异或运算

4.3 S盒置换

在密码学中,S盒(Substitution-box)是对称密钥算法 [1] 执行置换计算的基本结构。S盒用在分组密码算法中,是唯一的非线性结构,其S盒的指标的好坏直接决定了密码算法的好坏。S盒置换的目的是为了能够将长度为48位的输入转换成32位输出方便后续的运算

S盒共有8个,每个s盒有6个输入位,但之后只有4个输出位。
S盒样例如图所示(共有8个不同的S盒),默认s盒的行为扩展位组合后的值,列为原始位(中间四列)的值。

假设,经过加密异或运算后的输入为011001,那么由于第一列和最后一列为扩展位,将第一位和最后一位上的值提取出来,就是01,作为行数,为第二行。中间的四位即为列数,1100(12),再根据s盒查找得到的值为9(1001),输出为1001,即实现了转化。s盒的设计成为了算法好坏的关键。

4.4 P盒置换

p盒置换的目的是为了增加扩散。与其他置换类似也是有一个P盒置换的表。

————————————————————F函数到此为止——————————————————
4.5 将F函数运算的结果与左半边进行异或运算并作为下一轮输入的右半部分
这么做的目的增加混淆

4.6 将本轮加密运算开始前右半部分的二进制值作为下一轮输入的左半部分

4.7 进行下一轮加密,直至重复到16轮

STEP5 将加密结果进行逆初始置换

逆初始置换是初始置换的逆置换。数据块经过初始置换和逆初始置换后,可以恢复到原有的位置。

STEP6 得到最终加密结果

DES解密实现步骤

des解密步骤与之前加密的步骤基本相似,不过16组密钥需要reverse(逆置)一下。

注:在正式代码编写时还应注意分组效率和分组大小均一问题,此外还应该注意加密后密文的长度,所以最好能够和哈希(散列)函数一起使用。该算法安全性存在一i定缺陷,毕竟密钥仅仅为64位,不够长。

——————————————————————啦啦啦,本篇完结撒花—————————————————

程序猿成长之路之密码学篇-DES介绍相关推荐

  1. 程序猿成长之路番外篇之前后端加解密(rsa+aes混合加解密算法)

    今年国庆前夕接手一个外部项目,说是要保障接口数据安全,数据安全相对容易些,接口安全嘛emmmmm, 这个要考虑加解密算法.白名单之类的问题了.于是打算今天搞一期接口安全为题的成长之路番外篇. 为什么要 ...

  2. 程序猿致富之路——(投资理财篇)

    最近笔者在闲暇之余,泡了好几周基吧(基金吧)和在股票网站模拟一番,越来越起劲,对于我们程序猿来说,写代码固然重要,学会投资理财无疑让自己多了一条路,所也重要! 基金界"一姐"王茹远 ...

  3. JAVA程序员成长之路的总结

    JAVA程序员成长之路的总结 看了篇推荐贴,JAVA程序员成长之路的总结,大致适用于各种初级JAVA程序员规划借鉴之用, 原文地址http://tieba.baidu.com/p/2017010306 ...

  4. 原创电子书《菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师》

    <菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师> 国庆节快乐!一年一度长度排第二的假期终于来了. 难得有十一长假,作者也想要休息几天啦. 不管你是选择出门玩,还是在公司加班,在学 ...

  5. 程序员成长之路(四)之有用的网址

    2019独角兽企业重金招聘Python工程师标准>>> 通过Java来测试JSON和Protocol Buffer的传输文件大小 http://www.jb51.net/articl ...

  6. Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程–>错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个人 ...

  7. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  8. 程序员成长之路--软件架构

    程序员成长之路--软件架构 一.想成为一个合格的架构师,你要知道软件架构是个什么概念,明白架构的定义: 1.软件架构是一个系统的草图. 2.软件架构描述的对象是直接构成系统的抽象组件. 3.各个组件之 ...

  9. 程序猿,前路之路茫茫然 行业发展趋势

    程序猿,前路之路茫茫然 行业发展趋势 飞鸽传书 行业发展趋势 纵观软件行业的发展过程与趋势可以看出一共经历了以下几个阶段: ◆ 面向机器语言(Monolithic)的开发模式:根据不同平台的机器语言来 ...

最新文章

  1. js 各种常用js验证
  2. Java获取真实的IP地址--转载
  3. 如何用php采集照片,使用PHP采集远程图片
  4. ‘xxfile' Missing the class attribute 'ExtensionOfNativeClass'
  5. 双系统Ubuntu无法访问windows磁盘分区解决方法
  6. VC++ 读取和保存文件对话框及默认目录
  7. VC2010“添加资源-引入JPG图片”会改变图片大小
  8. elasticsearch-5.6.12 单点安装包括 HEAD插件安装
  9. 我TM快疯了,在博客园开博短短2个月,经历博客园数次故障。。。
  10. 计算机财务管理中表格的应用,论Excel表在财务管理中的应用
  11. 使用 Python MQTT 客户端 Paho-MQTT 的初学者指南
  12. 学习笔记(4):思科CCNA模拟器Packet Tracer使用入门-路由器的使用(2811、2911)
  13. java画脸_用Java画人脸
  14. 虚拟服务器有没有加入bt端口,bt端口映射怎么做?
  15. 数据库系统概论-数据库系统阶段的特点
  16. 单片机实例1——闪烁灯(硬件电路图+汇编程序+C语言程序)
  17. Selenium(2): DOM元素定位、操作
  18. 《九日集训》打卡第二天
  19. 幸福总会来的,对吗?
  20. BDD100K:大规模、多样化的驾驶视频数据集

热门文章

  1. Python数据分析-时间序列预测法
  2. MarkMan – 马克鳗 IU好伙伴啊
  3. odoo 中的 domian 和 运算符
  4. vue2/vue3详细知识点
  5. 【程序员必修数学课】-基础思想篇-二进制-原码反码补码的数学论证
  6. Working Practice-设置免打扰时间
  7. Handling Complexity in the Halo 2 AI
  8. pdf合并的工具下载
  9. java peek函数_java (String) s.peek()是什么意思?
  10. 如何制作Android.9图片