DES加密算法实现
好久没写博客了,正好趁着实现网络工程与安全的DES算法的功夫,把代码发上来。
DES的介绍可见:DES加密
原理不赘述了。。实在太多,其实就是一个形式化算法,按部就班的实现就可以,只不过有些繁琐,我写了3个晚上 = =。
主要实现了利用DES算法对一个文本文档加密,然后再将其内容解密。
程序截图
明文和密钥
加密然后解密
密文和解密后文本
代码
1 //该程序实现了文本文档的DES加密和解密。
2
3 #include <iostream>
4 #include <string.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 using namespace std;
8
9 //IP置换表
10 char IP[64] = {
11 57,49,41,33,25,17,9,1,
12 59,51,43,35,27,19,11,3,
13 61,53,45,37,29,21,13,5,
14 63,55,47,39,31,23,15,7,
15 56,48,40,32,24,16,8,0,
16 58,50,42,34,26,18,10,2,
17 60,52,44,36,28,20,12,4,
18 62,54,46,38,30,22,14,6};
19
20 //IP^-1 置换表
21 char IP_1[64] = {
22 39,7,47,15,55,23,63,31,
23 38,6,46,14,54,22,62,30,
24 37,5,45,13,53,21,61,29,
25 36,4,44,12,52,20,60,28,
26 35,3,43,11,51,19,59,27,
27 34,2,42,10,50,18,58,26,
28 33,1,41,9,49,17,57,25,
29 32,0,40,8,48,16,56,24};
30
31 //扩展置换表E
32 int E[48] = {31, 0, 1, 2, 3, 4,
33 3, 4, 5, 6, 7, 8,
34 7, 8,9,10,11,12,
35 11,12,13,14,15,16,
36 15,16,17,18,19,20,
37 19,20,21,22,23,24,
38 23,24,25,26,27,28,
39 27,28,29,30,31, 0};
40
41 //置换函数P
42 int P[32] = {15,6,19,20,28,11,27,16,
43 0,14,22,25,4,17,30,9,
44 1,7,23,13,31,26,2,8,
45 18,12,29,5,21,10,3,24};
46
47 //S盒
48 int S[8][4][16] ={
49 {{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7},
50 {0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8},
51 {4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0},
52 {15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}},
53
54 {{15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10},
55 {3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5},
56 {0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15},
57 {13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9}},
58
59 {{10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8},
60 {13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1},
61 {13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7},
62 {1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12}},
63
64 {{7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15},
65 {13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9},
66 {10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4},
67 {3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14}},
68
69 {{2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9},
70 {14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6},
71 {4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14},
72 {11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3}},
73
74 {{12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11},
75 {10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8},
76 {9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6},
77 {4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13}},
78
79 {{4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1},
80 {13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6},
81 {1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2},
82 {6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12}},
83
84 {{13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7},
85 {1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2},
86 {7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8},
87 {2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}}};
88 //置换选择1
89 int PC_1[56] = {56,48,40,32,24,16,8,
90 0,57,49,41,33,25,17,
91 9,1,58,50,42,34,26,
92 18,10,2,59,51,43,35,
93 62,54,46,38,30,22,14,
94 6,61,53,45,37,29,21,
95 13,5,60,52,44,36,28,
96 20,12,4,27,19,11,3};
97
98 //置换选择2
99 int PC_2[48] = {13,16,10,23,0,4,2,27,
100 14,5,20,9,22,18,11,3,
101 25,7,15,6,26,19,12,1,
102 40,51,30,36,46,54,29,39,
103 50,44,32,47,43,48,38,55,
104 33,52,45,41,49,35,28,31};
105
106 //对左移次数的规定
107 int LS[17] = {0,1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
108
109 //存放子密钥
110 unsigned __int64 K[17];
111
112 //将含64个二进制字符的字符串转换为二进制形式存储在long long int中
113 unsigned __int64 str2bit(unsigned char s[])
114 {
115 unsigned __int64 bin = 0;
116 int i;
117 for(i=0;i<64;i++){
118 bin = bin<<1 | (s[i]-'0'); //s[i]>>j & 1 表示取s[i]的第j位
119 }
120 return bin;
121 }
122
123 //将含8位字符串转换为二进制形式存储在long long int中,例ABCDEFGH转换为64位二进制数
124 unsigned __int64 bstr2bit(unsigned char s[])
125 {
126 unsigned __int64 bin = 0;
127 int i,j;
128 for(i=0;i<8;i++){
129 for(j=0;j<8;j++){
130 bin = bin | ( (unsigned __int64)((s[i]>>j)%2) << (j+8*(7-i)) ); //将s[i]的第j位(低位开始)取出放到bin的对应位置
131 }
132 }
133 return bin;
134 }
135
136 //将 unsigned __int64 形式的按十六进制串输出(64位有效的二进制数串)
137 void DisplayHex64(unsigned __int64 bin)
138 {
139 int i,t=0;
140 for(i=63;i>=0;i--){
141 t = t<<1 | ((bin>>i) & 1);
142 if(i%4==0){
143 if(0<=t && t<=9)
144 printf("%d",t);
145 else if(10<=t && t<=15)
146 printf("%c",65+t-10);
147 t=0;
148 }
149 if(i%8==0)
150 printf(" ");
151 }
152 printf("\n");
153 }
154 //将 unsigned __int64 形式的按十六进制串输出(48位有效的二进制数串)
155 void DisplayHex48(unsigned __int64 bin)
156 {
157 int i,t=0;
158 for(i=47;i>=0;i--){
159 t = t<<1 | ((bin>>i) & 1);
160 if(i%4==0){
161 if(0<=t && t<=9)
162 printf("%d",t);
163 else if(10<=t && t<=15)
164 printf("%c",65+t-10);
165 t=0;
166 }
167 if(i%8==0)
168 printf(" ");
169 }
170 printf("\n");
171 }
172 //将 unsigned __int64 形式的按十六进制串输出(32位有效的二进制数串)
173 void DisplayHex32(unsigned __int64 bin)
174 {
175 int i,t=0;
176 for(i=31;i>=0;i--){
177 t = t<<1 | ((bin>>i) & 1);
178 if(i%4==0){
179 if(0<=t && t<=9)
180 printf("%d",t);
181 else if(10<=t && t<=15)
182 printf("%c",65+t-10);
183 t=0;
184 }
185 if(i%8==0)
186 printf(" ");
187 }
188 printf("\n");
189 }
190 //将 unsigned __int64 形式的按十六进制串输出(28位有效的二进制数串)
191 void DisplayHex28(unsigned __int64 bin)
192 {
193 int i,t=0;
194 for(i=27;i>=0;i--){
195 t = t<<1 | ((bin>>i) & 1);
196 if(i%4==0){
197 if(0<=t && t<=9)
198 printf("%d",t);
199 else if(10<=t && t<=15)
200 printf("%c",65+t-10);
201 t=0;
202 }
203 if(i%8==0)
204 printf(" ");
205 }
206 printf("\n");
207 }
208
209 //将 unsigned __int64 形式的二进制串和十六进制输出(64位有效的二进制数串)
210 void DisplayBin64(unsigned __int64 bin)
211 {
212 int i;
213 for(i=63;i>=0;i--){
214 printf("%d",(bin>>i) %2);
215 }
216 printf("\n");
217 DisplayHex64(bin);
218 }
219
220 //将 unsigned __int64 形式的二进制串和十六进制输出(48位有效的二进制数串)
221 void DisplayBin48(unsigned __int64 bin)
222 {
223 int i;
224 for(i=47;i>=0;i--){
225 printf("%d",(bin>>i) %2);
226 }
227 printf("\n");
228 DisplayHex48(bin);
229 }
230
231 //将 unsigned __int64 形式的二进制串和十六进制输出(32位有效的二进制数串)
232 void DisplayBin32(unsigned __int64 bin)
233 {
234 int i;
235 for(i=31;i>=0;i--){
236 printf("%d",(bin>>i) %2);
237 }
238 printf("\n");
239 DisplayHex32(bin);
240 }
241
242 //将 unsigned __int64 形式的二进制串和十六进制输出(28位有效的二进制数串)
243 void DisplayBin28(unsigned __int64 bin)
244 {
245 int i;
246 for(i=27;i>=0;i--){
247 printf("%d",(bin>>i) %2);
248 }
249 printf("\n");
250 DisplayHex28(bin);
251 }
252
253
254 /* ------------------------------ 【1】初始置换IP ------------------------------
255 * 把明文顺序打乱重新排列,置换输出为64位,
256 * 数据置换后的第一位,第二位分别是原来的58、50位
257 */
258
259 unsigned __int64 InitReplace(unsigned __int64 bin) //初始置换IP
260 {
261 unsigned __int64 t = 0;
262 int i;
263 for(i=0;i<64;i++){
264 t = t | ( (bin>>(63-IP[i])) %2) << (63-i);
265 }
266 return t;
267 }
268
269 /* ------------------------------ 【2】将置换输出的64位数据分成左右两半 ------------------------------
270 * 左一半称为L0,右一半称为R0,各32位。
271 */
272
273 void DivideLR(unsigned __int64 binip,unsigned __int64 &L0,unsigned __int64 &R0) //将置换输出的64位数据分为L0(32位),R0(32位)两部分
274 {
275 unsigned __int64 one = 1;
276 L0 = binip >> 32;
277 R0 = binip % (one<<32);
278 }
279
280 /* ------------------------------ 【3】计算函数的16轮迭代 ------------------------------
281 * 1~16轮加密迭代
282 */
283
284 //置换选择1,64->56
285 unsigned __int64 FunPC_1(unsigned __int64 bink)
286 {
287 unsigned __int64 binpc_1 = 0;
288 int i;
289 for(i=0;i<56;i++)
290 binpc_1 |= ( (bink>>(63-PC_1[i])) %2) << (55-i);
291 return binpc_1;
292 }
293
294 //获得第i轮C,D,即Ci-1,Di-1 ==> Ci,Di
295 void getNextCD(int i,unsigned __int64 &C,unsigned __int64 &D)
296 {
297 unsigned __int64 t=0,one=1;
298 t = C >> (28-LS[i]);
299 C = (C<<LS[i])%(one<<28);
300 C |= t;
301 t = D >> (28-LS[i]);
302 D = (D<<LS[i])%(one<<28);
303 D |= t;
304 }
305
306 //置换选择2,56->48
307 unsigned __int64 FunPC_2(unsigned __int64 t)
308 {
309 //获得子密钥k
310 unsigned __int64 k=0;
311 int i;
312 for(i=0;i<48;i++)
313 k |= ( (t>>(55-PC_2[i])) %2) << (47-i);
314 return k;
315 }
316
317 //子密钥生成
318 void ProduceK(unsigned __int64 bink)
319 {
320 unsigned __int64 binpc_1,one=1,C=0,D=0;
321 binpc_1 = FunPC_1(bink); //置换选择1
322
323 //分成2个28位
324 C = binpc_1 >> 28;
325 D = binpc_1 % (one << 28);
326
327 int i;
328 for(i=1;i<=16;i++){
329 //确定子密钥K[i]
330 getNextCD(i,C,D);
331 printf("第%d轮:\n",i);
332 printf("C[%d] = ",i);
333 DisplayBin28(C);
334 printf("D[%d] = ",i);
335 DisplayBin28(D);
336 printf("\n");
337
338 unsigned __int64 t=0;
339 t = ((C<<28) | D)%(one<<56);
340 K[i] = FunPC_2(t); //进行置换选择2,将56位->48位子密钥
341 }
342 }
343
344 //扩展置换E,32->48
345 unsigned __int64 FunE(unsigned __int64 R)
346 {
347 unsigned __int64 t = 0;
348 int i;
349 for(i=0;i<48;i++)
350 t |= ( (R>>(31-E[i])) %2) << (47-i);
351 return t;
352 }
353
354 //S盒代换
355 unsigned __int64 FunS(unsigned __int64 RX)
356 {
357 int x,y,i;
358 unsigned __int64 one = 1,t,RS = 0;
359 for(i=0;i<8;i++){
360 t = ( RX >> (6*(7-i)) ) % (one<<6);
361 x = t>>5;
362 x = (x<<1) | (t%2);
363 y = (t<<1)%(one<<6)>>2;
364 RS = RS<<4 | S[i][x][y];
365 }
366 return RS;
367 }
368
369 //置换P运算
370 unsigned __int64 FunP(unsigned __int64 RS)
371 {
372 unsigned __int64 RP = 0;
373 int i;
374 for(i=0;i<32;i++)
375 RP |= ( (RS>>(31-P[i])) %2) << (31-i);
376 return RP;
377 }
378
379 //轮函数f(R,K)
380 unsigned __int64 f(int i,unsigned __int64 R,unsigned __int64 k)
381 {
382 unsigned __int64 RE,RX,RS,RP;
383 RE = FunE(R); //将32位Ri-1扩展置换为48位
384 RX = RE ^ k; //将48位RE与子密钥k异或运算
385 RS = FunS(RX); //S盒代换
386 RP = FunP(RS); //置换P运算
387 return RP;
388 }
389
390 unsigned __int64 Iteration16(unsigned __int64 L0,unsigned __int64 R0) //进行16次迭代计算
391 {
392 int i;
393 unsigned __int64 Ri = R0;
394 unsigned __int64 Li = L0;
395 printf("L0=");
396 DisplayBin32(L0);
397 printf("R0=");
398 DisplayBin32(R0);
399 printf("\n");
400 for(i=1;i<=16;i++){
401 printf("第%d轮加密:\n",i);
402 unsigned __int64 t = Ri;
403
404 //轮函数
405 Ri = f(i,Ri,K[i]);
406 printf("f(R%d,K%d)=",i-1,i);
407 DisplayBin32(Ri);
408
409 //Li-1和轮函数结果异或运算得到Ri
410 Ri = Li ^ Ri;
411 //轮函数运算结果即是Li
412 Li = t;
413
414 //输出Li和Ri
415 printf("L%d=",i);
416 DisplayBin32(Li);
417 printf("R%d=",i);
418 DisplayBin32(Ri);
419 printf("\n");
420 }
421
422 return Ri<<32 | Li;
423 }
424
425 unsigned __int64 InverseIteration16(unsigned __int64 L0,unsigned __int64 R0) //进行逆16次迭代计算,为解密过程
426 {
427 int i;
428 unsigned __int64 Ri = R0;
429 unsigned __int64 Li = L0;
430 printf("L0=");
431 DisplayBin32(L0);
432 printf("R0=");
433 DisplayBin32(R0);
434 printf("\n");
435 for(i=16;i>=1;i--){
436 printf("第%d轮加密:\n",17-i);
437 unsigned __int64 t = Ri;
438
439 //轮函数
440 Ri = f(i,Ri,K[i]);
441 printf("f(R%d,K%d)=",i-1,i);
442 DisplayBin32(Ri);
443
444 //Li-1和轮函数结果异或运算得到Ri
445 Ri = Li ^ Ri;
446 //轮函数运算结果即是Li
447 Li = t;
448
449 //输出Li和Ri
450 printf("L%d=",i);
451 DisplayBin32(Li);
452 printf("R%d=",i);
453 DisplayBin32(Ri);
454 printf("\n");
455 }
456
457 return Ri<<32 | Li;
458 }
459
460
461
462 /* ------------------------------ 【4】逆初始置换IP^-1 ------------------------------
463 * 把数据打乱重排,产生64位密文。
464 */
465
466 unsigned __int64 InverseInitReplace(unsigned __int64 bin) //进行逆初始置换IP^-1
467 {
468 unsigned __int64 t = 0;
469 int i;
470 for(i=0;i<64;i++){
471 t = t | ( (bin>>(63-IP_1[i])) %2) << (63-i);
472 }
473 return t;
474 }
475
476 void printOut(FILE* fo,unsigned __int64 bin)
477 {
478 char ans[8]={0},t=0;
479 int i,cnt=0;
480 for(i=63;i>=0;i--){
481 t = t<<1 | ((bin>>i)%2);
482 if(i%8==0){
483 ans[cnt++] = t;
484 t = 0;
485 }
486 }
487 fwrite(ans,1,8,fo);
488 }
489
490 //加密函数
491 void Encryption()
492 {
493 //文件读入
494 FILE* fm = fopen(".\\Plaintext.txt","rb"); //明文文件
495 FILE* fk = fopen(".\\key.txt","r"); //密钥文件
496 FILE* fo = fopen(".\\Ciphertext.txt","wb"); //密文文件
497
498 if(fm==NULL){
499 printf("明文文件input.txt打开失败\n");
500 }
501 if(fk==NULL){
502 printf("密钥文件key.txt打开失败\n");
503 }
504 if(fo==NULL){
505 printf("加密后文件output.txt打开失败\n");
506 }
507
508 unsigned char s[165]={0},key[65]={0};
509 int i;
510
511 fscanf(fk,"%s",key); //读取密钥
512
513 while(fread(s,1,8,fm)){
514 printf("----------------------------------------------------------------------------\n");
515 printf("\n");
516 printf("当前读取的明文串为:\n");
517 printf("%s\n",s);
518 unsigned __int64 bin = bstr2bit(s); //将加密串转换为2进制形式
519 printf("\n");
520 unsigned __int64 bink = str2bit(key); //将密钥串转换为2进制形式
521 printf("\n");
522
523 //输出
524 printf("\n");
525 printf("【输入】\n");
526 printf("输入的二进制明文串:\n");
527 DisplayBin64(bin);
528 printf("输入的二进制密钥串:\n");
529 DisplayBin64(bink);
530 printf("\n");
531
532 //IP置换
533 printf("明文初始化置换后:\n");
534 unsigned __int64 binip = InitReplace(bin);
535 DisplayBin64(binip);
536 printf("\n");
537
538 //获得L0,R0
539 printf("将明文分割为L0,R0两部分:\n");
540 unsigned __int64 L0,R0;
541 DivideLR(binip,L0,R0); //将binip分割为L0和R0
542 //输出L0,R0
543 printf("L0为:");
544 DisplayBin32(L0);
545 printf("R0为:");
546 DisplayBin32(R0);
547 printf("\n");
548
549 //生成16个子密钥,并输出
550 printf("--------------- 子密钥生成过程 ---------------\n");
551 memset(K,0,sizeof(K));
552 ProduceK(bink);
553 printf("生成的16个子密钥:\n");
554 for(i=1;i<=16;i++){
555 printf("K[%d]为 ",i);
556 DisplayBin48(K[i]);
557 //printf("\n");
558 }
559 printf("\n");
560
561 //16次加密迭代
562 printf("--------------- 16轮加密迭代 --------------- \n");
563 unsigned __int64 binIter = Iteration16(L0,R0);
564 printf("迭代加密后的结果:\n");
565 DisplayBin64(binIter);
566 printf("\n");
567
568 //逆初始置换IP_1
569 unsigned __int64 binip_1 = InverseInitReplace(binIter);
570 printf("最后,逆初始置换:\n");
571 DisplayBin64(binip_1);
572 printf("\n");
573
574 //输出最终加密结果
575 printf("【加密结果】\n明文 \"%s\" 的DES加密的结果为:\n",s);
576 DisplayBin64(binip_1);
577
578 printf("\n");
579 printf("----------------------------------------------------------------------------\n");
580 printf("\n");
581
582 //将加密结果写到加密文件中
583 printOut(fo,binip_1);
584
585 memset(s,0,sizeof(s));
586 }
587 //文件关闭
588 fclose(fm);
589 fclose(fk);
590 fclose(fo);
591 }
592
593 //解密函数
594 void Decryption()
595 {
596 //文件读入
597 FILE* fm = fopen(".\\Ciphertext.txt","rb"); //密文文件
598 FILE* fk = fopen(".\\key.txt","r"); //密钥文件
599 FILE* fo = fopen(".\\DecrypPlaintext.txt","wb"); //解密后文件
600
601 if(fm==NULL){
602 printf("密文文件 Ciphertext.txt 打开失败\n");
603 }
604 if(fk==NULL){
605 printf("密钥文件 key.txt 打开失败\n");
606 }
607 if(fo==NULL){
608 printf("解密后文件 DecrypPlaintext.txt 打开失败\n");
609 }
610
611 unsigned char s[165]={0},key[65]={0};
612 int i;
613
614 fscanf(fk,"%s",key); //读取密钥
615
616 while(fread(s,1,8,fm)){
617 printf("----------------------------------------------------------------------------\n");
618 printf("\n");
619 printf("当前读取的密文串为:\n");
620 printf("%s\n",s);
621 unsigned __int64 bin = bstr2bit(s); //将密文串转换为2进制形式
622 printf("\n");
623 unsigned __int64 bink = str2bit(key); //将密钥串转换为2进制形式
624 printf("\n");
625
626 //输出
627 printf("----------------------------------------------------------------------------\n");
628 printf("\n");
629 printf("【输入】\n");
630 printf("输入的二进制密文串:\n");
631 DisplayBin64(bin);
632 printf("输入的二进制密钥串:\n");
633 DisplayBin64(bink);
634 printf("\n");
635
636 //IP置换
637 printf("密文初始化置换后:\n");
638 unsigned __int64 binip = InitReplace(bin);
639 DisplayBin64(binip);
640 printf("\n");
641
642 //获得L0,R0
643 printf("将密文分割为L0,R0两部分:\n");
644 unsigned __int64 L0,R0;
645 DivideLR(binip,L0,R0); //将binip分割为L0和R0
646 //输出L0,R0
647 printf("L0为:");
648 DisplayBin32(L0);
649 printf("R0为:");
650 DisplayBin32(R0);
651 printf("\n");
652
653 //生成16个子密钥,并输出
654 printf("--------------- 子密钥生成过程 ---------------\n");
655 memset(K,0,sizeof(K));
656 ProduceK(bink);
657 printf("生成的16个子密钥:\n");
658 for(i=1;i<=16;i++){
659 printf("K[%d]为 ",i);
660 DisplayBin48(K[i]);
661 //printf("\n");
662 }
663 printf("\n");
664
665 //16次加密迭代
666 printf("--------------- 16轮加密迭代 --------------- \n");
667 unsigned __int64 binIter = InverseIteration16(L0,R0);
668 printf("迭代解密后的结果:\n");
669 DisplayBin64(binIter);
670 printf("\n");
671
672 //逆初始置换IP_1
673 unsigned __int64 binip_1 = InverseInitReplace(binIter);
674 printf("最后,逆初始置换:\n");
675 DisplayBin64(binip_1);
676 printf("\n");
677
678 //输出最终加密结果
679 printf("【解密结果】\n密文 \"%s\" 的DES解密的结果为:\n",s);
680 DisplayBin64(binip_1);
681
682 printf("\n");
683 printf("----------------------------------------------------------------------------\n");
684
685 //将加密结果写到加密文件中
686 printOut(fo,binip_1);
687
688 memset(s,0,sizeof(s));
689 }
690 //文件关闭
691 fclose(fm);
692 fclose(fk);
693 fclose(fo);
694 }
695
696 int Menu(int &Case)
697 {
698 int in;
699
700 FILE* fk = fopen(".\\key.txt","r"); //密钥文件
701 if(fk==NULL){
702 printf("密钥文件key.txt打开失败\n");
703 }
704
705 unsigned char key[100];
706 fscanf(fk,"%s",key); //读取密钥
707 unsigned __int64 bink = str2bit(key); //将密钥串转换为2进制形式
708 printf("【%d】当前密钥(key)为:(二进制形式)\n",Case++);
709 DisplayBin64(bink);
710 printf("(密钥存储在 key.txt 中)\n");
711 printf("\n");
712
713 printf("请选择,是使用DES算法加密还是解密?\n");
714 printf("(加密过程:Plaintext.txt => Ciphertext.txt\n");
715 printf(" 解密过程:Ciphertext.txt => DecrypPlaintext.txt )\n");
716 printf("[1] 加密\n");
717 printf("[2] 解密\n");
718 printf("[0] 退出程序\n");
719
720 scanf("%d",&in);
721 getchar();
722 fflush(stdin); // 清空缓冲区
723
724 if(in==0 || in==1 || in==2){
725 return in;
726 }
727 else{
728 printf("输入错误,请重新输入!\n");
729 printf("\n");
730 printf("----------------------------------------------------------------------------\n");
731 printf("\n");
732 return -1;
733 }
734 }
735
736 /*
737 * 主函数
738 */
739 int main()
740 {
741 int Case=1,in;
742 while(1){
743 in = Menu(Case);
744 switch(in){
745 case -1: //输入错误,进入下次循环
746 break;
747 case 0: //退出程序
748 printf("谢谢使用 :)\n");
749 return 0;
750 case 1: //加密
751 Encryption();
752 break;
753 case 2: //解密
754 Decryption();
755 break;
756 }
757 }
758 return 0;
759 }
Freecode : www.cnblogs.com/yym2013