zoukankan      html  css  js  c++  java
  • DES算法详解

    简介

      DES(Data Encryption Standard)数据加密标准。
      DES是有IBM公司研制的一种对称加密算法,美国国家标准局于1977年公布把它作为非机要部门使用的数据加密标准。
      DES是一个分组加密算法,就是将明文分组进行加密,每次按顺序取明文一部分,一个典型的DES以64位为分组,加密解密用算法相同。它的密钥长度为56位,因为每组第8位是用来做奇偶校验,密钥可以是任意56位的数,保密性依赖于密钥。

    概念

      1、密钥:8个字节共64位的工作密钥(决定保密性能)
      2、明文:8个字节共64位的需要被加密的数据
      3、密文:8个字节共64位的需要被解密的数据

    加解密过程

    加密

      1、明文数据分组,64位一组。
      2、对每组数据进行初始置换。
        即将输入的64位明文的第1位置换到第40位,第2位置换到第8位,第3位置换到第48位。以此类推,最后一位是原来的第7位。置换规则是规定的。L0(Left)是置换后的数据的前32位,R0(Right)是置换后的数据的后32位;
        具体置换规则有四步:
        第一步:将明文数据转换为16*4的二维数组,形成一个数据空间。
        第二步:数据左右对分,变成两个16*2的二维数组,然后每个数组各自都需要这样操作:从下往上,每两行形成一行数据。分别得到两个8*4的二维数组。
        第三步:新建一个16*4的二维数组(strNew1[16][4]),数组上半部分空间的数据存储左边数据块置换的结果,下半部分存储右边数据库置换的结果。
        最后一步:把整个(strNew1[16][4])16*4的二维数组数据空间的按列进行置换到新的二维数组(strNew2[16][4]):
        数组strNew1第2列放到数组strNew2第1列的位置;
        数组strNew1第4列放到数组strNew2第2列的位置;
        数组strNew1第1列放到数组strNew2第3列的位置;
        数组strNew1第3列放到数组strNew2第4列的位置;
        数组strNew2就是我们初始置换的结果。
      3、在初始置换后,明文数据再被分为左右两部分,每部分32位,以L0,R0表示。
      4、在秘钥的控制下,经过16轮的f函数运算。
        函数f的输出经过一个异或运算,和左半部分结合形成新的右半部分,原来的右半部分成为新的左半部分。
        函数f由四步运算构成:秘钥置换(Kn的生成,n=0~16),总共16轮,每轮都会产生一个子密钥;扩展置换(也有一个置换表);S-盒代替(8个用于代替的数组);P-盒置换(置换表)。时间有限,这里就不做深入讲解,具体置换过程,大家可以参看我的博客。
      f函数运算流程:

      4.1、秘钥置换--子密钥生成

      DES算法由64位秘钥产生16轮的48位子秘钥。在每一轮的迭代过程中,使用不同的子秘钥。

      a、把密钥的奇偶校验位忽略不参与计算,即每个字节的第8位,将64位密钥降至56位,然后根据选择置换PC-1将这56位分成两块C0(28位)和D0(28位);

      b、将C0和D0进行循环左移变化(注:每轮循环左移的位数由轮数决定),变换后生成C1和D1,然后C1和D1合并,并通过选择置换PC-2生成子密钥K1(48位);

      c、C1和D1在次经过循环左移变换,生成C2和D2,然后C2和D2合并,通过选择置换PC-2生成密钥K2(48位);

      d、以此类推,得到K16(48位)。但是最后一轮的左右两部分不交换,而是直接合并在一起R16L16,作为逆置换的输入块。其中循环左移的位数一共是循环左移16次,其中第一次、第二次、第九次、第十六次是循环左移一位,其他都是左移两位。

      4.2 密钥置换选择1(PC-1)(子秘钥的生成)

      操作对象是64位秘钥

      64位秘钥降至56位秘钥不是说将每个字节的第八位删除,而是通过缩小选择换位表1(置换选择表1)的变换变成56位。置换表(PC-1)如下:

      注意:这里的数字表示的是原数据的位置(下标),不是数据

    57,49,41,33,25,17,09,01,
    58,50,42,34,26,18,10,02,
    59,51,43,35,27,19,11,03,
    60,52,44,36,63,55,47,39,
    31,23,15,07,62,54,46,38,
    30,22,14,06,61,53,45,37,
    29,21,13,05,28,20,12,04

      再将56位秘钥分成C0和D0

      C0(28位)=K57K49K41...K44K36

    57,49,41,33,25,17,09,
    01,58,50,42,34,26,18,
    10,02,59,51,43,35,27,
    19,11,03,60,52,44,36

      D0(28位)=K63K55K47...K12K04

    63,55,47,39,31,23,15,
    07,62,54,46,38,30,22,
    14,06,61,53,45,37,29,
    21,13,05,28,20,12,04

      根据轮数,将Cn和Dn分别循环左移1位或2位

      循环左移每轮移动的位数如下:

      第一轮是循环左移1位。C0循环左移1位后得到C1如下:

    49,41,33,25,17,09,01,
    58,50,42,34,26,18,10,
    02,59,51,43,35,27,19,
    11,03,60,52,44,36,57

      D0循环左移1位后得到D1如下:

    55,47,39,31,23,15,07,
    62,54,46,38,30,22,14,
    06,61,53,45,37,29,21,
    13,05,28,20,12,04,63

      C1和D1合并之后,再经过置换选择表2生成48位的子秘钥K1。置换选择表2(PC-2)如下:

      去掉第9、18、22、25、35、38、43、54位,从56位变成48位,再按表(PC-2)的位置置换。

    14,17,11,24,01,05,
    03,28,15,06,21,10,
    23,19,12,04,26,08,
    16,07,27,20,13,02,
    41,52,31,37,47,55,
    30,40,51,45,33,48,
    44,49,39,56,34,53,
    46,42,50,36,29,32

      C1和D1再次经过循环左移变换,生成C2和D2,C2和D2合并,通过PC-2生成子秘钥K2
      以此类推,得到子秘钥K1~K16。需要注意其中循环左移的位数。

      4.3 扩展置换E(E位选择表)

      通过扩展置换E,数据的右半部分Rn从32位扩展到48位。扩展置换改变了位的次序,重复了某些位。

      扩展置换的目的:

      a、产生与秘钥相同长度的数据以进行异或运算,R0是32位,子秘钥是48位,所以R0要先进行扩展置换之后与子秘钥进行异或运算;

      b、提供更长的结果,使得在替代运算时能够进行压缩。

      扩展置换E规则如下:

      扩展置换E(数组)如下:

    32,01,02,03,04,05,
    04,05,06,07,08,09,
    08,09,10,11,12,13,
    12,13,14,15,16,17,
    16,17,18,19,20,21,
    20,21,22,23,24,25,
    24,25,26,27,28,29,
    28,29,30,31,32,01

      4.4 S-盒代替(功能表S盒)
      Rn扩展置换之后与子秘钥Kn异或以后的结果作为输入块进行S盒代替运算
      功能是把48位数据变为32位数据

      代替运算由8个不同的代替盒(S盒)完成。每个S-盒有6位输入,4位输出。

      所以48位的输入块被分成8个6位的分组,每一个分组对应一个S-盒代替操作。

      经过S-盒代替,形成8个4位分组结果。

      注意:每一个S-盒的输入数据是6位,输出数据是4位,但是每个S-盒自身是64位
      每个S-和是4行16列的格式,因为二进制4位是0~15。8个S-盒的值如下:

      S-盒1:

    14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,
    0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,
    4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,
    15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13

      S-盒2:

    15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,
    3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,
    0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,
    13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9

      S-盒3:

    10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,
    13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,
    13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,
    1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12

      S-盒4:

    7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,
    13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,
    10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,
    3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14

      S-盒5:

    2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,
    14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,
    4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,
    11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3

      S-盒6:

    12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,
    10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,
    9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,
    4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13

      S-盒7:

    4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,
    13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,
    1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,
    6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12

      S-盒8:

    13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,
    1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,
    7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,
    2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11

      S-盒计算过程

      假设S-盒8的输入(即异或函数的第43~18位)为110011。

      第1位和最后一位组合形成了11(二进制),对应S-盒8的第3行。中间的4位组成形成1001(二进制),对应S-盒8的第9列。所以对应S-盒8第3行第9列值是12。则S-盒输出是1100(二进制)。

      4.5 P-盒置换

      S-盒代替运算,每一盒得到4位,8盒共得到32位输出。这32位输出作为P盒置换的输入块。

      P盒置换将每一位输入位映射到输出位。任何一位都不能被映射两次,也不能被略去。

      经过P-盒置换的结果与最初64位分组的左半部分异或,然后左右两部分交换,开始下一轮迭代。

      P-盒置换表(表示数据的位置)共32位

    16,07,20,21,29,12,28,17,01,15,23,26,5,18,31,10,
    02,08,24,14,32,27,03,9,19,13,30,06,22,11,04,25

      将32位的输入的第16位放在第一位,第七位放在第二位,第二十位放在第三位,以此类推。

      5、16轮后,左、右两部分交换,并连接再一起,再进行逆置换(初始置换的逆运算)。
      逆置换过程:
        将初始置换进行16次的迭代,即进行16层的加密变换,这个运算过程我们暂时称为函数f。得到L16和R16,将此作为输入块,进行逆置换得到最终的密文输出块。逆置换是初始置换的逆运算。从初始置换规则中可以看到,原始数据的第1位置换到了第40位,第2位置换到了第8位。则逆置换就是将第40位置换到第1位,第8位置换到第2位。以此类推,逆置换规则如下
    40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,
    38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29,
    36,4,44,12,52,20,60,28,35,3,43,11,51,19,59,27,
    34,2,42,10,50,18,58 26,33,1,41, 9,49,17,57,25

        注意:DES算法的加密密钥是根据用户输入的秘钥生成的,该算法把64位密码中的第8位、第16位、第24位、第32位、第40位、第48位、第56位、第64位作为奇偶校验位,在计算密钥时要忽略这8位.所以实际中使用的秘钥有效位是56位。

        秘钥共64位,每次置换都不考虑每字节的第8位,因为这一位是奇偶校验位,所以64位秘钥的第8、16、24、32、40、48、56、64位在计算秘钥时均忽略。

      6、输出64位密文。
     
    注意:为了美观,除了S盒子和逆置换表的单个数字前面没有加0,其他表均添加了0来补齐位置。

    解密

      加密和解密可以使用相同的算法。加密和解密唯一不同的是秘钥的次序是相反的。就是说如果每一轮的加密秘钥分别是K1、K2、K3...K16,那么解密秘钥就是K16、K15、K14...K1。为每一轮产生秘钥的算法也是循环的。加密是秘钥循环左移,解密是秘钥循环右移。解密秘钥每次移动的位数是:0、1、2、2、2、2、2、2、1、2、2、2、2、2、2、1。

    DES算法优缺点

      1、优点:简单,容易实现,运行效率高。
      2、缺点:容易被暴力破解,密钥难管理,不好分配(密钥交换问题--如何安全的将密钥传输给解密方),无签名认证功能。

    算法改进(3DES)

      它相当于是对每个数据块应用三次DES加密算法。普通DES算法密钥长度较短,容易被暴力破解。3DES即通过增加DES的密钥长度来避免类似的攻击。
  • 相关阅读:
    UVa 116 单向TSP(多段图最短路)
    POJ 1328 Radar Installation(贪心)
    POJ 1260 Pearls
    POJ 1836 Alignment
    POJ 3267 The Cow Lexicon
    UVa 1620 懒惰的苏珊(逆序数)
    POJ 1018 Communication System(DP)
    UVa 1347 旅行
    UVa 437 巴比伦塔
    UVa 1025 城市里的间谍
  • 原文地址:https://www.cnblogs.com/jockming/p/12156844.html
Copyright © 2011-2022 走看看