DES对称加密算法详解

哈哈,最近看了很多关于DES加密算法的文章,发现还是不是很清除,于是我决定自己来整理下思路,于是就有了这篇文章.

这里我们规定了:

        key : 64位密钥(对称加密算法的加密和解密都是同一个密钥)

        data: 我们的原文数据

DES算法过程

有明文M(64位) = 0123456789ABCDEF,

即 M(64位) = 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

L(32位) = 0000 0001 0010 0011 0100 0101 0110 0111

R(32位) = 1000 1001 1010 1011 1100 1101 1110 1111

           我们把最初的密码设为K。K0(64bit)= 133457799BBCDFF1;

 密钥变换

在64位密码中,其中8位为硬件需要的奇偶验证位,所以实际的密钥长度为56位。

K(64位) = 00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001;

K = 0001001   0011010   0101011   0111100   1001101   1011110   1101111   1111000;

                                       密钥转换表 PC-1
                                    57 49 41 33 25 17 9
                                    1 58 50 42 34 26 18
                                    10 2 59 51 43 35 27
                                    19 11 3 60 52 44 36
                                    63 55 47 39 31 23 15
                                    7 62 54 46 38 30 22
                                    14 6 61 53 45 37 29
                                    21 13 5 28 20 12 4 

转换规则为:根据转换表把64位密钥的第以为转换为原K的第57位,第二位转换为原K的第49位,直到最后。

从而得到 K+ = 1111000 0110011 0010101 0101111 0101010 1011001 1001111 0001111;

把K+分为左右各28位的C0,D0;

C0 =  1111000  0110011  0010101  0101111 

D0 =  0101010  1011001  1001111  0001111

C1和D1分别为C0和D0左移1位。… C3和D3分别为C2和D2左移2位 …

        从而得到C1D1 ~ C16D16:

C1 = 1110000110011001010101011111

D1 = 1010101011001100111100011110

C2 = 1100001100110010101010111111

D2 = 0101010110011001111000111101

C3 = 0000110011001010101011111111

D3 = 0101011001100111100011110101

C4 = 0011001100101010101111111100

D4 = 0101100110011110001111010101

… …

C15 = 1111100001100110010101010111

D15 = 1010101010110011001111000111

C16 = 1111000011001100101010101111

D16 = 0101010101100110011110001111

                                子密钥置换表PC-2

                                14 17 11 24 1 5
                                3 28 15 6 21 10
                                23 19 12 4 26 8
                                16 7 27 20 13 2
                                41 52 31 37 47 55
                                30 40 51 45 33 48
                                44 49 39 56 34 53
                                46 42 50 36 29 32 

                       第CnDn的9,18,22,25, 35,38,43,54位丢弃

Kn(48位) = PC-2( CnDn(56位) )

K1 = 000110 110000 001011 101111 111111 000111 000001 110010

K2 = 011110 011010 111011 011001 110110 111100 100111 100101

K3 = 010101 011111 110010 001010 010000 101100 111110 011001

K4 = 011100 101010 110111 010110 110110 110011 010100 011101

K5 = 011111 001110 110000 000111 111010 110101 001110 101000

K6 = 011000 111010 010100 111110 010100 000111 101100 101111

K7 = 111011 001000 010010 110111 111101 100001 100010 111100

K8 = 111101 111000 101000 111010 110000 010011 101111 111011

K9 = 111000 001101 101111 101011 111011 011110 011110 000001

K10 = 101100 011111 001101 000111 101110 100100 011001 001111

K11 = 001000 010101 111111 010011 110111 101101 001110 000110

K12 = 011101 010111 000111 110101 100101 000110 011111 101001

K13 = 100101 111100 010111 010001 111110 101011 101001 000001

K14 = 010111 110100 001110 110111 111100 101110 011100 111010

K15 = 101111 111001 000110 001101 001111 010011 111100 001010

K16 = 110010 110011 110110 001011 000011 100001 011111 110101

明文变换

 

                                对明文M使用IP(8×8)
                                58 50 42 34 26 18 10 2
                                60 52 44 36 28 20 12 4
                                62 54 46 38 30 22 14 6
                                64 56 48 40 32 24 16 8
                                57 49 41 33 25 17 9 1
                                59 51 43 35 27 19 11 3
                                61 53 45 37 29 21 13 5
                                63 55 47 39 31 23 15 7 

明文 M(64位) =0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

经过IP变换后有:

             IP(64位) = 1100 1100 0000 0000 1100 1100 1111 1111 1111 0000 1010 1010 1111 0000 1010 1010 

然后把 IP(64位)  =  L0(32位)  +  R0(32位)

            L0(32位) =  1100 1100 0000 0000 1100 1100 1111 1111

            R0(32位) =  1111 0000 1010 1010 1111 0000 1010 1010 

          从L0和R0开始,循环16次,得出L1R1到L16R16,

         依据递推公式: Ln = R(n-1)             Rn = L(n-1) + f (R(n-1),Kn)      (+表示异或)

         L1=R0            R1=L0异或F(R0,K1)

    F(R0,K1)的变换

     函数f 从一个32位的数据块R(n-1)和一个48位子钥Kn得到一个新的32位数据块。

先将32位R(n-1)按照下表扩展到48位,在进行异或运算得到48位数,将48位数顺序分成8份,6位一份,作为输入,通过第6位中的1和6作为行数2-5作为列数在S盒中进行置换最后形成32位的f (R(n-1),Kn)  可以设为 B[8][6]

   数据块的扩展置换
32, 1,  2,  3,  4,  5,   
4,  5,  6,  7,  8,  9,
8,  9,  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,  1,

  如果S1 是定义在这张表上的函数,B是一个6位的块,那么计算S1(B) 的方法是:B的第一位和最后一位组合起来的二进制数决定一个介于0和3之间的十进制数(或者二进制00到11之间)。设这个数为i。B的中间4位二进制数代表一个介于0到15之间的十进制数(二进制0000到1111)。设这个数为j。查表找到第i行第j列的那个数,这是一个介于0和15之间的数,并且它是能由一个唯一的4位区块表示的。这个区块就是函数S1 输入B得到的输出S1(B)。比如,对输入B = 011011 ,第一位是0,最后一位是1,决定了行号是01,也就是十进制的1 。中间4位是1101,也就是十进制的13,所以列号是13。查表第1行第13列我们得到数字5。这决定了输出;5是二进制0101,所以输出就是0101。也即S1(011011) = 0101。     

                               盒表
                               S1
 
     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
                                  S2
 
     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
                                  S3
 
     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
                                  S4
 
      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
                                  S5
 
      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
                                 S6
 
     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
                                 S7
 
      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
                                 S8
 
     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

       最后将 R(n-1)转换后的48位与Kn进行以后后再经过盒变换后还要再经过P变换就得到了f (R(n-1),Kn)

                               P
 
                         16   7  20  21
                         29  12  28  17
                          1  15  23  26
                          5  18  31  10
                          2   8  24  14
                         32  27   3   9
                         19  13  30   6
                         22  11   4  25

       在下一轮迭代中,我们的L2 = R1,这就是我们刚刚计算的结果。之后我们必须计算R2 =L1 + f(R1, K2),一直完成16个迭代。在第16个迭代之后,我们有了区块L16 and R16。接着我们逆转两个区块的顺序得到一个64位的区块:

R16L16

然后对其执行一个最终的变换 IP-1 ,其定义如下表所示:

                               IP-1
 
            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

   这样说你们可能不理解:

比如,如果我们使用了上述方法得到了第16轮的左右两个区块:

  1. L16 = 0100 0011 0100 0010 0011 0010 0011 0100 
  2. R16 = 0000 1010 0100 1100 1101 1001 1001 0101

我们将这两个区块调换位置,然后执行最终变换:

  1. R16L16 = 00001010 01001100 11011001 10010101 01000011 01000010 00110010 00110100
  2. IP-1 = 10000101 11101000 00010011 01010100 00001111 00001010 10110100 00000101

写成16进制得到:

  1. 85E813540F0AB405

这就是明文M = 0123456789ABCDEF的加密形式C = 85E813540F0AB405。

解密就是加密的反过程,执行上述步骤,只不过在那16轮迭代中,调转左右子秘钥的位置而已。

你可能感兴趣的:(decode)