程序猿成长之路之密码学篇-DES介绍

上一篇讲到了密码学的定义和发展历史,讲到了一些基础理论如扩散(明文的一位可以影响密文的多位)和混淆(密钥和密文的对应关系复杂化),如信息安全系统三要素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位,不够长。

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

猜你喜欢

转载自blog.csdn.net/qq_31236027/article/details/128209185