首页 > 代码库 > 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加密算法实现