DES加解密原理

    xiaoxiao2021-08-14  270

    1.   简介

           DESData Encryption Standard(数据加密标准)的缩写。它是由IBM公司研制的一种对称密码算法,美国国家标准局于1977年公布把它作为非机要部门使用的数据加密标准。

           DES加密算法是一种典型的对称加密,分组算法,以64位为分组,对数据加密,它的密钥长度是56(密钥可以是任意的56位的数,而且可以任意时候改变),加密解密用同一算法。

    2.   DES加密算法流程概要(可配合下文的详细流程进行理解):

           首先要生成一套加密密钥,从用户处取得一个64位长的密码口令(密钥中每个第8 位都用作奇偶校验,故有效密钥长度是56位),然后通过等分、移位、选取和迭代(下文有等分、移位、选取和迭代的详细过程)形成一套16个加密密钥,分别供每一轮运算中使用。

           DES64(bit)的明文分组M进行操作,M经过一个初始置换表IP,置换成m0。将m0明文分成左半部分和右半部分m0 = (L0R0),各32位长。然后进行16轮完全相同的运算(迭代),这些运算被称为函数f,在每一轮运算过程中数据与相应的密钥结合。

           在每一轮中,密钥位移位,然后再从密钥的56位中选出48位。通过一个扩展置换将数据的右半部分扩展成48位,并通过一个异或操作替代成新的48位数据,再将其压缩置换成32位。这四步运算构成了函数f。然后,通过另一个异或运算,函数f的输出与左半部分结合,其结果成为新的右半部分,原来的右半部分成为新的左半部分。将该操作重复16次。

           经过16轮迭代后,左,右半部分合在一起经过一个末置换(数据整理),这样就完成了加密过程。

    加密流程如图所示:

    3.   DES加密算法详细过程:

    3.1.  A密钥生成

    3.1.1.   第A-1步 取得密钥

    从用户处取得一个64(本文均指二进制位))长的密码口令key

           去除64位密码中作为奇偶校验位的第816243240485664位,剩下的56位作为有效输入密钥。

    3.1.2.   第A-2步 等分密钥

    1输入密钥位序/ A位序对照表

    1:密钥A位序对照表

    注:表中每个单元格的数字是输入密钥位序,每个单元格的位置排序就是A位序,从左向右排,排完一行接着排下一行(下同)。

    2:输入密钥位序/ B位序对照表

    2: 密钥B位序对照表

      通过以上两个表,把第A-1步中生成56位输入密钥分成均等的AB两部分,每部分为28位(注意:以上两个表中没有816243240485664位,是因为这些位都是上文A-1步中提到的奇偶校验位)。而且,等分为两部分的过程也不是简单地前后一分为二,而是参照表1和表2把输入密钥的位值填入相应的位置。 按对照表1所示,A的第一位为输入的64位密钥的第57位,A的第2位为64位密钥的第49位,……,依此类推,A的最后一位第28位是64位密钥的第36位。这样,形成了AB两部分:

      3.1.3.   第A-3 步 密钥移位

    3:每次迭代时密钥循环左移的位数

    3:密钥移位

      DES算法的密钥是经过16次迭代(循环左移)得到一组密钥的,把在第A-2步中生成的AB视为迭代的起始密钥,表3显示每一次迭代时密钥循环左移的位数。 比如在第1次迭代时密钥循环左移1位,第3次迭代时密钥循环左移2位。第9次迭代时密钥循环左移1位,第14次迭代时密钥循环左移2位。

    第一次迭代:,第i次迭代:

    3.1.4.      第A-4步 密钥选取

    在第A-3步中第i次迭代生成的两个28位长的密钥为,

    ,把合并,得

     

    4 56位密钥C的位序与加密密钥K的位序对照表

    4: 密钥C位序对照表

    按照表4所示k的第一位为56位密钥的第14位,k的第2位为56位密钥的第17位,。。。,依此类推,k的最后一位第48位是56位密钥的第32位。 这样,就生成了一个48位使用密钥:

     这个密钥在后面的加密运算中将与进行第i次迭代加密的数据进行按位异或。

    3.1.5.   第A-5步 密钥迭代

      DES算法密钥生成需要进行16次迭代,在完成16次迭代前,循环执行第A-3步和第A-4步,最终形成16套加密密钥:key[0]key[1]key[2]…key[14]key[15]

     

    3.2.       B数据的加密操作

    3.2.1.   B-1 取得数据

      把明文数据分成64位的数据块,不够64位的数据块以适当的方式补足(java中有好几种填充方式,这将在以后的java实现源码分析相关的文章中介绍):

    3.2.2.   第B-2步 初始换位置换

    5:初始置换表

    5:数据初始置换表

    注:表中每个单元格的位置排序是新数据的位序。下同。  按照表5所示把输入的64位数据的原第58位换到第一位,原第50位换到第二位,依此类推,。。。,原第7位换到第64位。最后的得到新的64位数据。

    置换前(oldData)与置换后(oldData)的数据如下:

    3.2.3.    B-3 数据扩展

    6: 数据扩展对照表(输入数据位序/生成新数据位序)

    6 数据扩展对照表

    第一次迭代以第B-2步中生成的newData作为输入数据,第i (i > 1)次迭代以第i-1次的64位输出数据为输入数据,先把64位数据按位置等分成左右两部分:

           保持left不变,根据表6right32位扩展置换成48位。在数据扩展操作中,有些输入数据位(如第14517282932……等数位)用了两次,因此数据得到了扩展。这样得到扩展后的48位右半部分为: 

    把扩展后的48right与上文A-5步第i次迭代生成的48位加密密钥进行按位异或操作

    形成一个新的48位的right

    3.2.4.   第B-4步 数据压缩

    先介绍8个压缩置换表:

    7.1:数据压缩置换表(灰色栏内是置换前的十进制数字,白色栏内是置换后的16进制数字)

    7.1:数据压缩置换表1

    7.2

    7.2:数据压缩置换表2

    7.3 至表7.8与上表形式完全相同,仅数值不同,为节省篇幅从略不表。 

     在B-3步中形成了48位的right,

    需要把48位的right值转换成32位的right值。置换的方法如下:第一步,先把right视为由86位二进制块组成,

    a,b…. h都是6位二进制数,转换成10进制整数的值应当都不大于64

           二步,a,b…h转换成10进制整数后,在对应的表中根据转换后整数值取得对应位置的替代值。这些替代值都是一个16进制的个位数,因此,每个替代值只占有二进制数4位。  转换时各查各表:  a对应表7.1b对应表7.2c对应表7.3d对应表7.4e对应表7.5f对应表7.6g对应表7.7h对应表7.8  比如:  a = 32 ,则到表7.1中找到32的位置,把对应的替代值16进制的8赋给a   b = 53 ,则到表7.2中找到的位置,把对应的替代值16进制的c赋给b   g = 16 则到表7.7中找到16的位置,把对应的替代值16进制的a赋给g   这样,每6位用一个4位替换,就完成了从48位向32位数据的压缩置换。

     有些资料中介绍6位转4位的实现方法与本文所采用的不同,但殊途同归,最终的目的是相同的。

    3.2.5.   第B-5步 数据换位置换

    8

    8:数据换位置换

    把第B-4步形成的32right

    根据表8进行转换:  数据的原第16位换到第一位,原第7位换到第二位,……,依此类推,最后得到新的32位数据。

    3.2.6.   第B-6步 交换数据

           right left按位异或后的值赋给right,然后将本轮输入的原始right值赋给left

    3.2.7.   第B-7步 迭代

      DES算法需要进行16次迭代,在完成16次迭代前,把第i-1次得到的的leftright的值作为第i次的输入数据,重复第B-3步到第B-6步的步骤。但是有一点要记住:在步骤第B-3中第i次迭代要选择第i次迭代生成的密钥与数据进行按位异或。

    B-8 数据整理

    9

    9:数据整理

    为保证加密和解密的对称性,DES算法的前15次迭代每完成一次迭代都要交换leftright的值,第16次迭代不交换两者的数值。  到此,把32位的leftright合并成64位的Data

     

     根据表9重新调整Data的位值,数据的原第40位换到第一位,原第8位换到第二位,。。。,依此类推,最后得到新的64位。 

     好了,经过了这么多次的数学运算,我们最终得到的Data即为密文。

    4.   数据的解密操作

      数据解密的算法与加密算法相同,区别在于第B-3步中和数据进行按位异或的密钥的使用顺序不同,在加密中是按照第i次迭代就采用第i次迭代生成的密钥进行异或,而解密时第i次迭代就采用第17-i次迭代生成的密钥和数据进行异或。

    5.   JAVA实现DES加解密

    考虑到DES加解密过程的复杂性,jdk提供了相关api(在jce.jar中),后文将会详细介绍。

    想了解更多信息请用微信扫描以下二维码关注本人原创公众号,多谢

    相关资源:DES原理及实现步骤,以及VC 关于DES加密解密的详细源程序

    最新回复(0)