DES加密與解密控制台c++代碼


  1 #include"stdafx.h"
  2 #include<stdio.h>
  3 #include<string.h>
  4  void main()
  5 { //聲明變量
  6     char MingWen[104]; //存放原始的明文
  7     char target[8]; //將明文斷成8個字符的一個分組
  8     char InputKey[9]; //存放字符型的八位密鑰
  9     int text[64]; //存放一個分組轉成二進制后的數據
 10     int text_ip[64]; //存放第一次初始換位的結果
 11     int L0[32], Li[32]; //將64位分成左右各32位進行迭代
 12     int R0[32], Ri[32];
 13     int RE0[48]; //存放右半部分經過E表擴展換位后的48位數據
 14     int key[64]; //存放密鑰的二進制形式
 15     int keyPC1[56]; //存放密鑰key經過PC1換位表后變成的56位二進制
 16     int A[28]; //將keyPC1分成左右兩部分,左部A,右部B,各28位,以便進行循環左移
 17     int B[28];
 18     int keyAB[56]; //將循環左移后兩部分的結果合並起來
 19     int K[16][48]; //存放16次循環左移產生的子密鑰
 20     int RK[48]; //存放RE和K異或運算后的結果
 21     int RKS[8]; //存放經過查找8個S表后得到的8個十進制結果
 22     int SP[32]; //將RKS表中的十進制數化成二進制
 23     int RKSP[32]; //存放SP表經過P盒換位后的結果
 24     int text_end[64]; //存放經過左右32位換位后的結果
 25     int text_out[14][64]; //存放初始化向量和所有經過DES的分組的二進制
 26     char init[9] = { "HTmadeit" }; //設置初始化向量為“HTmadeit”
 27     int CBC[64];
 28     int result[13][64];
 29     int H[208];
 30     char MiWen[208];
 31     int C[832];
 32     int M[13][8];
 33 
 34     char choice;
 35     int t;
 36     int i, j;
 37     int k, l, m, n;
 38     int r[8], c[8];
 39     int flag = 1;
 40 
 41     int IP[64] = { //初始換位表
 42         58, 50, 42, 34, 26, 18, 10, 2,
 43         60, 52, 44, 36, 28, 20, 12, 4,
 44         62, 54, 46, 38, 30, 22, 14, 6,
 45         64, 56, 48, 40, 32, 24, 16, 8,
 46         57, 49, 41, 33, 25, 17, 9, 1,
 47         59, 51, 43, 35, 27, 19, 11, 3,
 48         61, 53, 45, 37, 29, 21, 13, 5,
 49         63, 55, 47, 39, 31, 23, 15, 7
 50     };
 51 
 52     int E[48] = { //擴展換位表
 53         32, 1, 2, 3, 4, 5,
 54         4, 5, 6, 7, 8, 9,
 55         8, 9, 10, 11, 12, 13,
 56         12, 13, 14, 15, 16, 17,
 57         16, 17, 18, 19, 20, 21,
 58         20, 21, 22, 23, 24, 25,
 59         24, 25, 26, 27, 28, 29,
 60         28, 29, 30, 31, 32, 1 };
 61 
 62     int PC1[56] = { //PC1換位表(64—>56)
 63         57, 49, 41, 33, 25, 17, 9,
 64         1, 58, 50, 42, 34, 26, 18,
 65         10, 2, 59, 51, 43, 35, 27,
 66         19, 11, 3, 60, 52, 44, 36,
 67         63, 55, 47, 39, 31, 23, 15,
 68         7, 62, 54, 46, 38, 30, 22,
 69         14, 6, 61, 53, 45, 37, 29,
 70         21, 13, 5, 28, 20, 12, 4 };
 71 
 72     int move[16] = { //循環移位表
 73         1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1 };
 74 
 75     int PC2[48] = { //PC2換位表(56—>48)
 76         14, 17, 11, 24, 1, 5,
 77         3, 28, 15, 6, 21, 10,
 78         23, 19, 12, 4, 26, 8,
 79         16, 7, 27, 20, 13, 2,
 80         41, 52, 31, 37, 47, 55,
 81         30, 40, 51, 45, 33, 48,
 82         44, 49, 39, 56, 34, 53,
 83         46, 42, 50, 36, 29, 32 };
 84 
 85     int S1[4][16] = { //S換位表
 86         14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
 87         0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
 88         4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
 89         15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13
 90     };
 91     int S2[4][16] = {
 92         15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
 93         3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
 94         0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
 95         13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9
 96     };
 97     int S3[4][16] = {
 98         10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
 99         13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
100         13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
101         1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12
102     };
103     int S4[4][16] = {
104         7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
105         13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
106         10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
107         3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14
108     };
109     int S5[4][16] = {
110         2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
111         14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
112         4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
113         11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3
114     };
115     int S6[4][16] = {
116         12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
117         10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
118         9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
119         4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13
120     };
121     int S7[4][16] = {
122         4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
123         13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
124         1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
125         6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12
126     };
127     int S8[4][16] = {
128         13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
129         1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
130         7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
131         2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11
132     };
133     int P[32] = { //P換位表
134         16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,
135         2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25
136     };
137 
138     printf("歡迎使用SKY的加密&解密小程序!\n\n");
139     while (flag)
140     {
141         printf("A加密,B解密,請選擇:\n");
142         scanf("%c", &choice);
143 
144         while (choice != 'A'&&choice != 'B'&&choice != 'a'&&choice != 'b')
145         {
146             printf("對不起,您的輸入不合法。請選擇A或B,A表示加密,B表示解密。\n");
147             scanf("%c", &choice);
148         }
149         getchar();
150 
151         //生成子密鑰
152         printf("請輸入8位密鑰:\n");
153         gets_s(InputKey);
154         while (InputKey[7] == '\0' || InputKey[8] != '\0')
155         {
156             printf("您輸入的密鑰位數有誤,請重新輸入8位密鑰:\n");
157             gets_s(InputKey);
158         }
159 
160         for (i = 0; i<8; i++) //將密鑰轉化成64位二進制數放到一維數組key中
161         {
162             int a[8] = { 0,0,0,0,0,0,0,0 };
163             m = InputKey[i];
164             for (j = 0; m != 0; j++)
165             {
166                 a[j] = m % 2;
167                 m = m / 2;
168             }
169             for (j = 0; j<8; j++)
170                 key[(i * 8) + j] = a[7 - j];
171         }
172 
173         //for(i=0;i<64;i++)
174         //printf("%d,",key[i]);
175 
176         for (i = 0; i<56; i++) //通過PC1換位表變成56位密鑰放在keyPC1中
177             keyPC1[i] = key[PC1[i] - 1];
178 
179         for (i = 0; i<28; i++) //分成A和B兩部分,各28位
180         {
181             A[i] = keyPC1[i];
182             B[i] = keyPC1[i + 28];
183         }
184 
185         for (t = 0; t<16; t++)
186         {
187             if (move[t] == 1) //按照循環移位表將Ai和Bi分別左移move[t]位
188             {
189                 n = A[0];
190                 for (i = 0; i<27; i++)
191                     A[i] = A[i + 1];
192                 A[27] = n;
193                 n = B[0];
194                 for (i = 0; i<28; i++)
195                     B[i] = B[i + 1];
196                 B[27] = n;
197             }
198             else
199             {
200                 n = A[0];
201                 m = A[1];
202                 for (i = 0; i<26; i++)
203                     A[i] = A[i + 2];
204                 A[26] = n;
205                 A[27] = m;
206                 n = B[0];
207                 m = B[1];
208                 for (i = 0; i<26; i++)
209                     B[i] = B[i + 2];
210                 B[26] = n;
211                 B[27] = m;
212             }
213 
214             for (i = 0; i<28; i++) //將A和B合並成56位
215             {
216                 keyAB[i] = A[i];
217                 keyAB[i + 28] = B[i];
218             }
219 
220             for (i = 0; i<48; i++) //通過PC2換位表變成48位密鑰
221                 K[t][i] = keyAB[PC2[i] - 1];
222         }
223 
224         //for(t=0;t<16;t++) 
225         //for(i=0;i<48;i++)
226         // printf("%d,",K[t][i]);
227 
228         for (i = 0; i<8; i++) //將初始化向量轉化成二進制數儲存到數組text_out的第一行中
229         {
230             int a[8] = { 0,0,0,0,0,0,0,0 };
231             m = init[i];
232             for (j = 0; m != 0; j++)
233             {
234                 a[j] = m % 2;
235                 m = m / 2;
236             }
237             for (j = 0; j<8; j++)
238                 text_out[0][(i * 8) + j] = a[7 - j];
239         }
240 
241 
242         //加密程序
243 
244         if (choice == 'A' || choice == 'a')
245         {
246             printf("請輸入您想加密的內容:\n"); //輸入明文
247             gets_s(MingWen);
248             while (MingWen[0] == '\0')
249             {
250                 printf("對不起,明文不可為空,請您輸入正確的明文。\n");
251                 gets_s(MingWen);
252             }
253 
254             //CBC模式下的加密
255             i = 0; //將明文每8個字符作為一個分組,共有n個分組
256             n = 0;
257             while (MingWen[i] != '\0')
258             {
259                 n++;
260                 i++;
261             }
262             k = n % 8;
263             n = (n - 1) / 8 + 1;
264 
265             for (l = 0; l<n; l++)
266             {
267                 if (l == (n - 1) && k != 0)
268                 {
269                     for (i = 0; i<k; i++) //將每個分組的8個字符放到數組target中,不夠的用空格補充
270                         target[i] = MingWen[i + (8 * l)];
271                     for (i = k; i<8; i++)
272                         target[i] = ' ';
273                 }
274                 else
275                     for (i = 0; i<8; i++)
276                         target[i] = MingWen[i + (8 * l)];
277 
278                 for (i = 0; i<8; i++) //將得到的明文轉化成二進制數儲存到數組text中
279                 {
280                     int a[8] = { 0,0,0,0,0,0,0,0 };
281                     m = target[i];
282                     for (j = 0; m != 0; j++)
283                     {
284                         a[j] = m % 2;
285                         m = m / 2;
286                     }
287                     for (j = 0; j<8; j++)
288                         text[(i * 8) + j] = a[7 - j];
289                 }
290 
291                 //for(i=0;i<64;i++)
292                 //printf("%d,",text[i]);
293                 //printf("\n");
294 
295                 //for(i=0;i<64;i++)
296                 //printf("%d,",text_out[l][i]);
297                 //printf("\n");
298 
299                 for (i = 0; i<64; i++) //CBC模式下前一分組的密文異或當前分組
300                     text[i] = text_out[l][i] ^ text[i];
301 
302                 //for(i=0;i<64;i++)
303                 //printf("%d,",text[i]);
304                 //printf("\n");
305 
306                 //對每個text進行DES加密
307 
308                 for (i = 0; i<64; i++) //進行初始換位
309                     text_ip[i] = text[IP[i] - 1];
310 
311                 for (i = 0; i<32; i++) //分成左右兩部分,各32位
312                 {
313                     L0[i] = text_ip[i];
314                     R0[i] = text_ip[i + 32];
315                 }
316 
317                 //for(i=0;i<32;i++)
318                 // printf("%d,",L0[i]);
319                 //for(i=0;i<32;i++)
320                 // printf("%d,",R0[i]);
321 
322 
323                 //十六次迭代
324 
325                 for (t = 0; t<16; t++)
326                 {
327                     for (i = 0; i<48; i++) //將右半部分通過擴展換位表E從32位擴展成48位
328                         RE0[i] = R0[E[i] - 1];
329 
330                     //printf("RE0\n");
331                     //for(i=0;i<48;i++)
332                     //printf("%d,",RE0[i]);
333 
334                     for (i = 0; i<48; i++) //RE與K異或運算
335                         RK[i] = RE0[i] ^ K[t][i];
336 
337 
338                     //printf("\n");
339                     //for(i=0;i<48;i++)
340                     //printf("%d,",RK[i]);
341 
342                     for (i = 0; i<8; i++) //將R和K異或運算的結果通過S位移表
343                     {
344                         r[i] = RK[(i * 6) + 0] * 2 + RK[(i * 6) + 5];
345                         c[i] = RK[(i * 6) + 1] * 8 + RK[(i * 6) + 2] * 4 + RK[(i * 6) + 3] * 2 + RK[(i * 6) + 4];
346                     }
347                     RKS[0] = S1[r[0]][c[0]];
348                     RKS[1] = S2[r[1]][c[1]];
349                     RKS[2] = S3[r[2]][c[2]];
350                     RKS[3] = S4[r[3]][c[3]];
351                     RKS[4] = S5[r[4]][c[4]];
352                     RKS[5] = S6[r[5]][c[5]];
353                     RKS[6] = S7[r[6]][c[6]];
354                     RKS[7] = S8[r[7]][c[7]];
355 
356                     for (i = 0; i<8; i++) //把結果轉成32位二進制儲存在數組SP中
357                     {
358                         int b[4] = { 0,0,0,0 };
359                         m = RKS[i];
360                         for (j = 3; m != 0; j--)
361                         {
362                             b[j] = m % 2;
363                             m = m / 2;
364                         }
365                         for (j = 0; j<4; j++)
366                             SP[j + (i * 4)] = b[j];
367                     }
368 
369                     for (i = 0; i<32; i++) //將二進制結果再經過一個P盒換位
370                         RKSP[i] = SP[P[i] - 1];
371 
372                     for (i = 0; i<32; i++) //與前一次的左部異或運算,得到本次迭代的右部
373                         Ri[i] = L0[i] ^ RKSP[i];
374 
375                     for (i = 0; i<32; i++)
376                     {
377                         L0[i] = R0[i];
378                         R0[i] = Ri[i];
379                     }
380                 }
381 
382                 //一個左右32位交換
383 
384                 for (i = 0; i<32; i++)
385                     Li[i] = R0[i];
386                 for (i = 0; i<32; i++)
387                     R0[i] = L0[i];
388                 for (i = 0; i<32; i++)
389                     L0[i] = Li[i];
390 
391 
392                 //初始換位的逆過程
393 
394                 for (i = 0; i<32; i++) //把左右兩部分合起來存到text_end中
395                     text_end[i] = L0[i];
396                 for (i = 32; i<64; i++)
397                     text_end[i] = R0[i - 32];
398 
399                 for (i = 0; i<64; i++) //進行初始換位的逆過程
400                     text_out[l + 1][IP[i] - 1] = text_end[i];
401 
402                 for (i = 0; i<64; i++)
403                     result[l][i] = text_out[l + 1][i];
404 
405                 //for(i=0;i<64;i++)
406                 //printf("%d,",result[l][i]);
407                 //printf("\n");
408             }
409 
410             for (j = 0; j<n; j++) //把result中的二進制密文轉成十進制存到數組H中
411                 for (i = 0; i<16; i++)
412                     H[i + (j * 16)] = result[j][0 + (i * 4)] * 8 + result[j][1 + (i * 4)] * 4 + result[j][2 + (i * 4)] * 2 + result[j][3 + (i * 4)];
413 
414             //for(i=0;i<l*16;i++)
415             //printf("%d,",H[i]);
416 
417             for (i = 0; i<n * 16; i++)
418             {
419                 if (H[i]<10)
420                     MiWen[i] = H[i] + 48;
421                 else if (H[i] == 10)
422                     MiWen[i] = 'A';
423                 else if (H[i] == 11)
424                     MiWen[i] = 'B';
425                 else if (H[i] == 12)
426                     MiWen[i] = 'C';
427                 else if (H[i] == 13)
428                     MiWen[i] = 'D';
429                 else if (H[i] == 14)
430                     MiWen[i] = 'E';
431                 else if (H[i] == 15)
432                     MiWen[i] = 'F';
433                 //else MiWen[i]='\0';
434             }
435             for (i = l * 16; i<224; i++)
436                 MiWen[i] = '\0';
437 
438             printf("您的文件經過DES加密后的密文是:\n");
439             printf("%s\n", MiWen);
440             printf("\n\n");
441         }
442 
443 
444         //解密程序
445         else if (choice == 'B' || choice == 'b')
446         {
447             printf("請輸入密文內容:\n");
448             gets_s(MiWen);
449 
450             for (i = 0; i<208; i++)
451                 H[i] = 0;
452 
453             for (i = 0; MiWen[i] != '\0'; i++) //將十六進制密文轉化成十進制存放在數組H中
454             {
455                 if (MiWen[i] >= '0'&&MiWen[i] <= '9')
456                     H[i] = MiWen[i] - '0';
457                 else if (MiWen[i] >= 'A'&&MiWen[i] <= 'F')
458                     H[i] = MiWen[i] - 'A' + 10;
459                 else if (MiWen[i] >= 'a'&&MiWen[i] <= 'f')
460                     H[i] = MiWen[i] - 'a' + 10;
461                 else
462                 {
463                     printf("請輸入用十六進制表示的密文內容:\n");
464                     gets_s(MiWen);
465                     i = 0;
466                 }
467             }
468             n = i; //密文中共有n個字符
469             if (n % 16 != 0)
470             {
471                 printf("對不起,您輸入的密文不正確,請確認密文的內容,密文的字符數應是16的倍數。\n");
472                 printf("請輸入密文內容:\n");
473                 gets_s(MiWen);
474 
475                 for (i = 0; i<208; i++)
476                     H[i] = 0;
477                 for (i = 0; MiWen[i] != '\0'; i++) //將十六進制密文轉化成十進制存放在數組H中
478                 {
479                     if (MiWen[i] >= '0'&&MiWen[i] <= '9')
480                         H[i] = MiWen[i] - '0';
481                     else if (MiWen[i] >= 'A'&&MiWen[i] <= 'F')
482                         H[i] = MiWen[i] - 'A' + 10;
483                     else if (MiWen[i] >= 'a'&&MiWen[i] <= 'f')
484                         H[i] = MiWen[i] - 'a' + 10;
485                 }
486             }
487 
488             for (i = 0; i<n; i++) //將十進制密文轉化成二進制存放在數組C中
489             {
490                 int he[4] = { 0,0,0,0 };
491                 for (j = 3; H[i] != 0; j--)
492                 {
493                     he[j] = H[i] % 2;
494                     H[i] = H[i] / 2;
495                 }
496                 for (j = 0; j<4; j++)
497                     C[j + (i * 4)] = he[j];
498             }
499 
500             //for(i=0;i<130;i++)
501             // printf("%d,",C[i]);
502             //printf("\n");
503 
504             k = n / 16;
505             for (l = 0; l<k; l++)
506             {
507                 for (i = 0; i<64; i++) //將每個分組對應的64位二進制密文放到text_out中
508                     text_out[l + 1][i] = C[i + (l * 64)];
509 
510                 //for(i=0;i<64;i++)
511                 // printf("%d,",text_out[l][i]);
512                 //printf("\n");
513 
514                 //對每個text進行DES解密
515 
516                 for (i = 0; i<64; i++) //進行初始換位
517                     text_ip[i] = text_out[l + 1][IP[i] - 1];
518 
519                 //for(i=0;i<64;i++)
520                 //printf("%d,",text_ip[i]);
521                 //printf("\n");
522 
523                 for (i = 0; i<32; i++) //分成左右兩部分,各32位
524                 {
525                     L0[i] = text_ip[i];
526                     R0[i] = text_ip[i + 32];
527                 }
528                 //for(i=0;i<32;i++)
529                 // printf("%d,",L0[i]);
530                 //for(i=0;i<32;i++)
531                 // printf("%d,",R0[i]);
532 
533 
534                 //十六次迭代
535 
536                 for (t = 0; t<16; t++)
537                 {
538                     for (i = 0; i<48; i++) //將右半部分通過擴展換位表E從32位擴展成48位
539                         RE0[i] = R0[E[i] - 1];
540 
541                     //printf("RE0\n");
542                     //for(i=0;i<48;i++)
543                     //printf("%d,",RE0[i]);
544 
545                     for (i = 0; i<48; i++) //RE與K異或運算
546                         RK[i] = RE0[i] ^ K[15 - t][i];
547 
548                     //printf("\n");
549                     //for(i=0;i<48;i++)
550                     //printf("%d,",RK[i]);
551 
552                     for (i = 0; i<8; i++) //將R和K異或運算的結果通過S位移表
553                     {
554                         r[i] = RK[(i * 6) + 0] * 2 + RK[(i * 6) + 5];
555                         c[i] = RK[(i * 6) + 1] * 8 + RK[(i * 6) + 2] * 4 + RK[(i * 6) + 3] * 2 + RK[(i * 6) + 4];
556                     }
557 
558                     RKS[0] = S1[r[0]][c[0]];
559                     RKS[1] = S2[r[1]][c[1]];
560                     RKS[2] = S3[r[2]][c[2]];
561                     RKS[3] = S4[r[3]][c[3]];
562                     RKS[4] = S5[r[4]][c[4]];
563                     RKS[5] = S6[r[5]][c[5]];
564                     RKS[6] = S7[r[6]][c[6]];
565                     RKS[7] = S8[r[7]][c[7]];
566 
567                     for (i = 0; i<8; i++) //把結果轉成32位二進制儲存在數組SP中
568                     {
569                         int b[4] = { 0,0,0,0 };
570                         m = RKS[i];
571                         for (j = 3; m != 0; j--)
572                         {
573                             b[j] = m % 2;
574                             m = m / 2;
575                         }
576                         for (j = 0; j<4; j++)
577                             SP[j + (i * 4)] = b[j];
578                     }
579 
580                     for (i = 0; i<32; i++) //將二進制結果再經過一個P盒換位
581                         RKSP[i] = SP[P[i] - 1];
582 
583                     for (i = 0; i<32; i++) //與前一次的左部異或運算,得到本次迭代的右部
584                         Ri[i] = L0[i] ^ RKSP[i];
585 
586                     for (i = 0; i<32; i++)
587                     {
588                         L0[i] = R0[i];
589                         R0[i] = Ri[i];
590                     }
591                 }
592 
593                 //一個左右32位交換
594 
595                 for (i = 0; i<32; i++)
596                     Li[i] = R0[i];
597                 for (i = 0; i<32; i++)
598                     R0[i] = L0[i];
599                 for (i = 0; i<32; i++)
600                     L0[i] = Li[i];
601 
602                 //初始換位的逆過程
603 
604                 for (i = 0; i<32; i++) //把左右兩部分合起來存到text_end中
605                     text_end[i] = L0[i];
606                 for (i = 32; i<64; i++)
607                     text_end[i] = R0[i - 32];
608 
609                 for (i = 0; i<64; i++) //進行初始換位的逆過程 
610                     text[IP[i] - 1] = text_end[i];
611 
612 
613                 //CBC模式下的解密
614 
615                 for (i = 0; i<64; i++) //前一分組的密文異或當前分組所得明文的二進制放到result中
616                     result[l][i] = text_out[l][i] ^ text[i];
617 
618             }
619 
620             for (i = 0; i<(n / 16); i++) //將二進制轉成十進制
621                 for (j = 0; j<8; j++)
622                     M[i][j] = result[i][(j * 8) + 0] * 128 + result[i][(j * 8) + 1] * 64 + result[i][(j * 8) + 2] * 32 + result[i][(j * 8) + 3] * 16 + result[i][(j * 8) + 4] * 8 + result[i][(j * 8) + 5] * 4 + result[i][(j * 8) + 6] * 2 + result[i][(j * 8) + 7];
623 
624             printf("您的文件經過DES解密后的明文是:\n");
625             for (i = 0; i<(n / 16); i++)
626                 for (j = 0; j<8; j++)
627                     printf("%c", M[i][j]);
628             printf("\n\n\n");
629         }
630         flag = 0;
631         printf("是否繼續?\n");
632         printf("Y繼續,N退出,請選擇:\n");
633         scanf("%c", &choice);
634 
635         while (choice != 'Y'&&choice != 'N'&&choice != 'y'&&choice != 'n')
636         {
637             printf("對不起,您的輸入不合法。請選擇Y或N,Y表示繼續使用本程序,N表示退出。\n");
638             scanf("%c", &choice);
639         }
640         getchar();
641         if (choice == 'Y' || choice == 'y')
642             flag = 1;
643     }
644 } 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM