程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> DES算法及其在VC++6.0下的實現(下)

DES算法及其在VC++6.0下的實現(下)

編輯:關於VC++

在《DES算法及其在VC++6.0下的實現(上)》中主要介紹了DES算法的基本原理,下面讓我們繼續:

二.子密鑰的生成

64比特的密鑰生成16個48比特的子密鑰。其生成過程見圖:

子密鑰生成過程具體解釋如下:

64比特的密鑰K,經過PC-1後,生成56比特的串。其下標如表所示: 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

該比特串分為長度相等的比特串C0和D0。然後C0和D0分別循環左移1位,得到C1和D1。C1和D1合並起來生成C1D1。C1D1經過PC-2變換後即生成48比特的K1。K1的下標列表為:

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

C1、D1分別循環左移LS2位,再合並,經過PC-2,生成子密鑰K2……依次類推直至生成子密鑰K16。

注意:Lsi (I =1,2,….16)的數值是不同的。具體見下表:

迭代順序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 左移位數 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1

生成子密鑰的VC程序源代碼如下:

for(i=1;i<57;i++)//輸入64位K,經過PC-1變為56位   k0[i]=k[PC_1[i-1]];

56位的K0,均分為28位的C0,D0。C0,D0生成K1和C1,D1。以下幾次迭代方法相同,僅以生成K8為例。for(i=1;i<27;i++)//循環左移兩位
  {
   C8[i]=C7[i+2];
   D8[i]=D7[i+2];
  }
  C8[27]=C7[1];
  D8[27]=D7[1];
  C8[28]=C7[2];
  D8[28]=D7[2];
  for(i=1;i<=28;i++)
  {
   C[i]=C8[i];
   C[i+28]=D8[i];
  }
  for(i=1;i<=48;i++)
   K8[i]=C[PC_2[i-1]];//生成子密鑰k8

注意:生成的子密鑰不同,所需循環左移的位數也不同。源程序中以生成子密鑰 K8為例,所以循環左移了兩位。但在編程中,生成不同的子密鑰應以Lsi表為准。

三.解密

DES的解密過程和DES的加密過程完全類似,只不過將16圈的子密鑰序列K1,K2……K16的順序倒過來。即第一圈用第16個子密鑰K16,第二圈用K15,其余類推。

第一圈:

加密後的結果

L=R15, R=L15⊕f(R15,K16)⊕f(R15,K16)=L15

同理R15=L14⊕f(R14,K15), L15=R14。

同理類推:

得 L=R0, R=L0。

其程序源代碼與加密相同。在此就不重寫。

四.示例

例如:已知明文m=learning, 密鑰 k=computer。

明文m的ASCII二進制表示:

m= 01101100 01100101 01100001 01110010

01101110 01101001 01101110 01100111

密鑰k的ASCII二進制表示:

k=01100011 01101111 01101101 01110000

01110101 01110100 01100101 01110010

明文m經過IP置換後,得:

11111111 00001000 11010011 10100110 00000000 11111111 01110001 11011000

等分為左右兩段:

L0=11111111 00001000 11010011 10100110 R0=00000000 11111111 01110001 11011000

經過16次迭代後,所得結果為:

L1=00000000 11111111 01110001 11011000 R1=00110101 00110001 00111011 10100101

L2=00110101 00110001 00111011 10100101 R2=00010111 11100010 10111010 10000111

L3=00010111 11100010 10111010 10000111 R3=00111110 10110001 00001011 10000100

L4=00111110101100010000101110000100 R4=11110111110101111111101000111110

L5=11110111110101111111101000111110 R5=10010110011001110100111111100101

L6=10010110011001110100111111100101 R6=11001011001010000101110110100111

L7=11001011001010000101110110100111 R7=01100011110011101000111011011001

L8=01100011110011101000111011011001 R8=01001011110100001111001000000100

L9=01001011110100001111001000000100 R9=00011101001101111010111011100001

L10=00011101001101111010111011100001 R10=11101110111110111111010100000101

L11=11101110111110111111010100000101 R11=01101101111011011110010111111000

L12=01101101111011011110010111111000 R12=11111101110011100111000110110111

L13=11111101110011100111000110110111 R13=11100111111001011010101000000100

L14=11100111111001011010101000000100 R14=00011110010010011011100001100001

L15=00011110010010011011100001100001 R15=01010000111001001101110110100011

L16=01010000111001001101110110100011 R16=01111101101010000100110001100001

其中,f函數的結果為:

f1=11001010001110011110100000000011 f2=00010111000111011100101101011111

f3=00001011100000000011000000100001 f4=11100000001101010100000010111001

f5=10101000110101100100010001100001 f6=00111100111111111010011110011001

f7=11110101101010011100000100111100 f8=10000000111110001010111110100011

f9=01111110111110010010000000111000 f10=10100101001010110000011100000001

f11=01110000110110100100101100011001 f12=00010011001101011000010010110010

f13=10001010000010000100111111111100 f14=11100011100001111100100111010110

f15=10110111000000010111011110100111 f16=01100011111000011111010000000000

16個子密鑰為:

K1=11110000101111101110111011010000 K2=11100000101111101111011010010101

K3=11110100111111100111011000101000 K4=11100110111101110111001000011010

K5=11101110110101110111011100100110 K6=11101111110100110101101110001011

K7=00101111110100111111101111100110 K8=10111111010110011101101101010000

K9=00011111010110111101101101000100 K10=00111111011110011101110100001001

K11=00011111011011011100110101101000 K12=01011011011011011011110100001010

K13=11011101101011011010110110001111 K14=11010011101011101010111110000000

K15=11111001101111101010011011010011 K16=11110001101111100010111000000001

S盒中,16次運算時,每次的8 個結果為:

第一次:5,11,4,1,0,3,13,9;

第二次:7,13,15,8,12,12,13,1;

第三次:8,0,0,4,8,1,9,12;

第四次:0,7,4,1,7,6,12,4;

第五次:8,1,0,11,5,0,14,14;

第六次:14,12,13,2,7,15,14,10;

第七次:12,15,15,1,9,14,0,4;

第八次:15,8,8,3,2,3,14,5;

第九次:8,14,5,2,1,15,5,12;

第十次:2,8,13,1,9,2,10,2;

第十一次:10,15,8,2,1,12,12,3;

第十二次:5,4,4,0,14,10,7,4;

第十三次:2,13,10,9,2,4,3,13;

第十四次:13,7,14,9,15,0,1,3;

第十五次:3,1,15,5,11,9,11,4;

第十六次:12,3,4,6,9,3,3,0;

子密鑰生成過程中,生成的數值為:

C0=0000000011111111111111111011 D0=1000001101110110000001101000

C1=0000000111111111111111110110 D1=0000011011101100000011010001

C2=0000001111111111111111101100 D2=0000110111011000000110100010

C3=0000111111111111111110110000 D3=0011011101100000011010001000

C4=0011111111111111111011000000 D4=1101110110000001101000100000

C5=1111111111111111101100000000 D5=0111011000000110100010000011

C6=1111111111111110110000000011 D6=1101100000011010001000001101

C7=1111111111111011000000001111 D7=0110000001101000100000110111

C8=1111111111101100000000111111 D8=1000000110100010000011011101

C9=1111111111011000000001111111 D9=0000001101000100000110111011

C10=1111111101100000000111111111 D10=0000110100010000011011101100

C11=1111110110000000011111111111 D11=0011010001000001101110110000

C12=1111011000000001111111111111 D12=1101000100000110111011000000

C13=1101100000000111111111111111 D13=0100010000011011101100000011

C14=0110000000011111111111111111 D14=0001000001101110110000001101

C15=1000000001111111111111111101 D15=0100000110111011000000110100

C16=0000000011111111111111111011 D16=1000001101110110000001101000

解密過程與加密過程相反,所得的數據的順序恰好相反。在此就不贅述。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved