加密算法------DES加密算法詳解

一、加密算法的分類

1.對稱加解密算法

a.通信雙方同時掌握一個密鑰,加密解密都是由一個密鑰完成的(即加密密鑰等於解密密鑰,加解密密鑰可以相互推倒出來)。

b.雙方通信前共同擬定一個密鑰,不對第三方公開。

c.不具有個體原子性,一個密鑰被共享,泄漏機率增大

2.公私鑰加解密算法

a.通信雙方掌握不同的密鑰,不同方向的加解密由不同的密鑰完成。

二、對稱加密算法的代表----DES加密算法

原理:該算法是一個利用56+8奇偶校驗位(第8,16,24,32,40,48,56,64)=64位的密鑰對以64位爲單位的塊數據進行加解密。

具體過程:

    有明文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

    有密鑰64位:133457799BBCDFF1

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

            注:其中紅色爲奇偶校驗位,即實際密鑰爲56位

第一步:按照下表中的規則對各個位進行交換,生成16個子鑰(48位)

交換規則表(8*7):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

交換方法:第一行第一列的數爲57,那麼就將K中第一位上的數換成K中第57位上的數(將0換爲了57位上的1),依次類推。

那麼原K(64位) = 00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001

去掉奇偶校驗位,再經過上表的轉換就變爲了:

     K + (56位) =  1111000  0110011  0010101  0101111  0101010   1011001    1001111  0001111

因此:C0(28位) = 1111000  0110011  0010101  0101111

          D0(28位) = 0101010   1011001    1001111  0001111

下來依次是C1,D1爲C0,D0左移一位,C2,D2爲C1,D1左移一位,C3,D3爲C2,D2左移兩位.......


所以,可以得到C1D1----C16D16的結果爲:

C1 = 1110000 1100110 01010101011111

D1 = 1010101011001100111100011110

C2 = 1100001100110010101010111111

D2 = 0101010110011001111000111101

C3 = 0000110011001010101011111111

D3 = 0101011001100111100011110101

................

.................

C15 = 1111100001100110010101010111

D15 = 1010101010110011001111000111

C16 = 1111000011001100101010101111

D16 = 0101010101100101101110001111


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

PC-2(8*6)----爲一個8*6的矩陣,將上面得到的16個子鑰按照下表的規律進行位的交換

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

因此,通過上面公式的計算可以得到:

K1 = 000110 110000 001011 101111 111111 000111 000001 110010

Eg:C1D1 = 1110000 1100110 0101010 1011111  1010101 0110011 0011110 0011110

紅色部分爲奇偶校驗位,那麼通過上表對C1D1進行位的變換:將14位上的0放到第一位,將17位上的0放到第二位,將11位上的0放到第三位,將24位上的1放到第四位,將1位上的一放到第五位,將5位上的0放到第六位;則最後的前6位的結果·就·變爲000110,剩下的做法同上

****************以下做法都同K1*********************************

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

因此,最終就得到了如上的16個子密鑰,每個48位

第二步:用得到的子密鑰對64位數據加密

對明文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

對M進行IP操作可以得到:

            IP(64位) = 1100 1100 0000 0000 1100 1100 1111 1111 11111 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位) = 11111 0000 1010 1010 1111 0000 1010 1010

接下來,從L0和R0開始,循環16次根據遞推公式


得出L1R1到L16R16。其中除了Kn爲48位,其它變量及函數均爲32位。

得到L1R1到L16R16的具體過程如下:

1.將數據的右半部分R0通過擴展置換E從32位擴展到48位

    通過將原32位數據中的某些位重複出現達到擴展的目的。擴展置換也稱位選擇函數,俗稱E盒,擴展置換E通過將第32,1,4,5,8,9,12,13,16,17,20,21,24,25,28,29共16位分別放置在兩個位置,從而將32位的數據擴展爲48位。


根據上面的E表則擴展之後的R0爲:

 原來的: R0(32位) = 1111 0000 1010 1010 1111 0000 1010 1010

 擴展後: R0(64位) = 011110 100001 010101 010101 011110 100001 010101 010101

然後將R0(64位)與

                K1(64位) =  000110 110000 001011 101111 111111 000111 000001 110010做異或運算

得到結果爲:E(R(n-1)異或K1) = 011000 010001 011110 111010 100001 100110 010100  100111

(2).將異或後的結果通過S盒子轉換爲32位

    將異或運算得到的48位結果數據分成8個6位的塊,將每一塊通過對應的一個S盒產生一個4位的輸出,S盒接收6位的輸入,經過置換輸出4位的數據,具體置換過程爲:

    將6位的輸入中的第一位和第六位取出來1形成一個兩位的二進制數X,將其轉換爲十進制作爲行數,然後將中間4位構成另一個二進制數Y,並將其轉換爲十進制數作爲列,然後查出S的X行Y列所對應的整數,將該整數置換爲一個4位的二進制數,即S盒的輸出。(eg:輸入數據中的第一個6位數據塊位010111,則需要通過查S1盒,先取出010111的第一位和第六位,則X=01,其對應的十進制爲1。然後取出中間4位的1011,則Y = 1011,其對應的十進制爲11,在S1盒中第1行11列的數爲11,將其轉換爲二進制位1011,則輸出1011)



 將第一步得到的結果: 011000 010001 011110 111010 100001 100110 010100  100111

進行S盒置換得到的十進制爲:5 10 7 10 15 8 6 2

轉換爲相應的二進制位:0101 1010 0111 1010 1111 1000 0110 0010

3.進行P盒置換

    將S盒輸出結果再通過一個P盒置換產生一個32位輸出


上步得到的結果使用P盒置換後得到的結果爲:

                                     0111 0101 0101 1111 1000 0100 1100 0110

將此結果與 L0(32位) = 1100 1100 0000 0000 1100 1100 1111 1111

進行異或運算得到結果爲:1011 1001 1010 0000 0100 1000 0011 1001

4.左右交換位置

將上步的結果賦給R1

    即R1 = 1011 1001 1010 0000 0100 1000 0011 1001

R0則原封不動的賦給L1

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

之後進入下一輪迭代。最後生成L16和R16,其中R16爲L15與P盒置換結果做異或運算的結果,L16是R15的直接賦值

5.密文的生成

    經過16次的迭代,我們得到了16對32位的數據塊,即L1R1,L2R2,......L16R16;

    最後一對L16R16就是我們需要的。然後將L16與R16的位置交換,繼續對R16L16(64位)運用一次IP-1排列


即在:L16(32位) = 0100 0011 0100 0010 0011 0010 0011 0100

          R16(32位) = 0000 1010 0100 1100 1101 1001 1001 0101

     R16L16(64位) = 00001010 01001100 11011001 10010101 01000011  01000010 00110010 00110100

時,對R16L16運用IP-1,得

IP-1(64位) = 10000101 11101000 00010011 01010100 00001111 00001010 10110100 00000101

                    =85E813540F0AB405

至此,我們就得到了明文M的密文。


以上爲加密過程,要解密,依次反向計算即可。




參考博客:https://blog.csdn.net/yxtxiaotian/article/details/52025653

                 http://www.doc88.com/p-9909383710144.html



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章