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 } 

猜你喜欢

转载自www.cnblogs.com/jakejian/p/9141144.html