DES简介
数据加密标准(Data Encryption Standard,缩写为 DES)是一种对称密钥加密块密码算法,它基于使用56位密钥的对称算法。
然而DES现在已经不是一种安全的加密方法,主要因为它使用的56位密钥过短。
算法原理与流程
DES是一种分组加密算法,每次都处理固定的64位大小的明文,返回64位的密文,对于长度为n的,可以分成若干个64位的,剩余的小于64位的可以按照某种具体的规则来填充位。
流程大概这样是
这个过程中有三个重要的框架:
- 左边的Feistel加密结构
- 右上角的密钥生成过程
- 右下角的F(X, Y)的工作过程
置换表
这个过程中用到了许多的置换表,主要作用有两个:(不是所有的置换表都有这两个作用)
- 消位。比如密钥生成过程的第一步:K通过PC-1盒置换来去掉奇偶校验位,使得从64位变成56位;还有类似的PC-2盒;以及轮函数中的S盒可以理解为一个特殊的置换表
- 混淆。扩散和混淆是Shannon提出的设计密码系统的两个基本方法,混淆的目的是使的明文和密文之间的关系尽可能复杂
根据下面的表我们来理解一下置换表的工作方法
现在有一个64位的串s,那从表a[65]的第一个a[1]开始,a[1]=57
表示将s[57]
放到t
串的第一位,a[2] = 49
表示将s[49]
放到 t
串的第2位…….知道放完最后一个,就会得到一个t
串,这个t
串就是 s
串经过置换表后的结果
Feistel加密结构
介绍:
很多分组密码的结构本质上来说是基于Feistel网络的结构,通过交换、异或等操作得到密文,大体结构如下所示:
就是进行16轮的代换-置换
轮函数:
这是Feistel最基本的函数,下一个的L是上一个的R,下一个的R是上一个的L⨁F(上一个的R, K)
这里我们分析一下DES的Feistel框架:
- 首先对于输入的
64bit
的明文,先通过一个IP置换表,进行一次置换 - 然后将产生的
64bit
的东西从中间劈开,分成,作为初始的值进行第一次的轮函数, , ,这个函数和密钥的产生我们一会再讲 - 如此下去进行16轮,最后得到
- 交换一下
,得到 64bit
的 - 再进行一次逆IP置换,得到
64bit
的密文
密钥生成
DES只需要一个初始的56bit
的密钥,那怎么产生16个轮函数所需的
首先,提一个小的点,DES使用一个56位的初始密钥,但提供的其实是一个64位的值,这是因为在硬件实现中每8位可以用于奇偶校验,在软件实现中多出的位只是简单的忽略掉。
所以第8位、16位、32位、40位、48位、56位、64位都是奇偶校验位,
而忽略掉他们的方法就是我上次讲的置换函数的第一个作用:去位
64bit
的初始密钥,经过置换盒子——PC-1盒,去掉奇偶校验位,得到56bit
,分成左右两部分28bit
,经过密钥位移表,得到56bit
的一个串经过置换盒子——PC-2盒压缩得到48bit
的
PC-1盒是56位的置换盒,PC-2盒是一个48位的置换盒,密钥移位表是一个2行16列的表,表示第 i
次
假如一个串是100010101,左移2位就是:001010110
F(R,K)函数
首先是对于32bit
的48bit
再与32bit
的串,再进入P盒进行置换
E盒
该置换盒的主要目的是在加密数据的过程中制造一些雪崩效应,使用数据块中的1位将在下一步操作中影响更多位,从而产生扩散效果。
这是一个扩展盒,扩展的方法是:将32位的数分成8个4位的,对于第 i
个的组成是
比如
其实就是把原来的前一个拿过来,后一个拿过来
S盒
进行压缩的盒子,可以将48bit
压缩成32bit
方法是:将48bit
分成8份,每份6个数,用第一个和最后一个组成二进制转换成十进制对应行i
,中间的四个数构成的二进制转换成十进制,作为列j
,查表得到一个十进制,再转换成二进制即可
最后
根据框架图硬算就行了,这里就不放代码了
最后就是能得到64位的密文