首页 > 代码库 > DES加密算法实现
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) //初始置换IP260 {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->56285 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,Di295 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->48307 unsigned __int64 FunPC_2(unsigned __int64 t)308 {309 //获得子密钥k310 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); //置换选择1322 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->48345 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和轮函数结果异或运算得到Ri410 Ri = Li ^ Ri;411 //轮函数运算结果即是Li412 Li = t;413 414 //输出Li和Ri415 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和轮函数结果异或运算得到Ri445 Ri = Li ^ Ri;446 //轮函数运算结果即是Li447 Li = t;448 449 //输出Li和Ri450 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^-1467 {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,R0539 printf("将明文分割为L0,R0两部分:\n");540 unsigned __int64 L0,R0;541 DivideLR(binip,L0,R0); //将binip分割为L0和R0542 //输出L0,R0543 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_1569 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,R0643 printf("将密文分割为L0,R0两部分:\n");644 unsigned __int64 L0,R0;645 DivideLR(binip,L0,R0); //将binip分割为L0和R0646 //输出L0,R0647 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_1673 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
DES加密算法实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。