鱼C论坛

 找回密码
 立即注册
查看: 971|回复: 1

数字异或加密求助

[复制链接]
发表于 2021-1-27 10:54:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 guhusf 于 2021-1-27 11:09 编辑

各位大佬帮忙看一看,为什么对数字进行加密时,出现数字3就会终止解密?比如我要对数字12456789加密,解密后没有问题,但是数字里出现了3,比如12345678,解密时3及以后的数字都会消失。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<string.h>
  4. #include<windows.h>
  5.         char password1[20],password2[20],way2[20];
  6. void BUILD_D()                          //D盘建立文件
  7. {
  8. FILE *fp;
  9. char name[20],text[1000000];
  10. char way[20] = "d:\";//设置路径为d盘
  11. printf("请输入文件名称:\n");
  12. scanf("%s",name);
  13. strcat(name,".txt");//给文件名加上后缀
  14. strcat(way,name);//添加路径
  15. strcpy(way2,way);
  16. fp = fopen(way,"w");
  17. printf("请输入内容:\n");
  18. while(1)
  19. {

  20. gets(text);
  21. if(!strcmp(text,"##"))
  22. break;
  23. else
  24. {
  25.         fputs(text,fp);
  26.         fputs("\n",fp); //用于转行
  27. }
  28. }
  29. fclose(fp);
  30. }
  31.         void BUILD_E()                          //E盘建立文件
  32. {
  33. FILE *fp;
  34. char name[20],text[1000000];
  35. char way[20] = "e:\";//设置路径为d盘
  36. printf("请输入文件名称:\n");
  37. scanf("%s",name);
  38. strcat(name,".txt");//给文件名加上后缀
  39. strcat(way,name);//添加路径
  40. strcpy(way2,way);
  41. fp = fopen(way,"w");
  42. printf("请输入内容:\n");
  43. while(1)
  44. {

  45. gets(text);
  46. if(!strcmp(text,"##"))
  47. break;
  48. else
  49. {
  50.         fputs(text,fp);
  51.         fputs("\n",fp); //用于转行
  52. }
  53. }
  54. fclose(fp);
  55. }
  56. void password_check()                  //密码判断程序
  57. {

  58.         int i,num,letters,all,a;          //a用于序号选择
  59.         L:  i = 0,num = 0,letters = 0,all = 0,a = 0;
  60.         scanf("%s",password1);
  61.         while (password1[0]>= '0' && password1[0]<='9')        //判断第一位是否为字母,不是则重新输入密码
  62.                 {
  63.                         printf("首字母必须是字母!\n");
  64.                         printf("请重新输入密码!");
  65.                                 scanf("%s",password1);
  66.                 }
  67.         while(password1[i] != '\0')
  68.         {       
  69.                 if (password1[i]>= '0' && password1[i]<='9')        //统计数字数量
  70.                 {
  71.                         num++;                                                                       
  72.                 }
  73.                 else if(password1[i]>='a'&&password1[i]<='z'||password1[i]>='A'&&password1[i]<='Z')                //统计字母数量
  74.                 {
  75.                     letters++;                                                         
  76.                 }
  77.                 i++;
  78.         }
  79.         all = num + letters;
  80.         printf("数字个数%d,字母个数%d,总密码长度%d\n",num,letters,all);
  81.         if(all<6)                //判断密码长度
  82.         {
  83.                 printf("密码长度必须不小于六位!\n");
  84.                         printf("请重新输入密码!\n");
  85.        
  86.                 goto L;
  87.         }
  88.         else if (num<3  &&  letters>2)      //判断数字数量是否大于2
  89.         {
  90.                 printf("数字个数必须大于2!\n");
  91.                 printf("请重新输入密码!\n");
  92.        
  93.                 goto L;
  94.         }
  95.         else if (letters<3  &&  num>2)       //判断字母数量是否大于2
  96.         {
  97.                 printf("字母个数必须大于2!\n");
  98.                 printf("请重新输入密码!\n");
  99.                        
  100.                 goto L;
  101.         }
  102.     else if(num<3 && letters<3)           //判断字母和数字数量是否均大于2  
  103.     {
  104.                    
  105.                 printf("字母和数字个数均必须大于2!\n");
  106.                 printf("请重新输入密码!\n");
  107.                
  108.                 goto L;
  109.        
  110.         }
  111.         M:printf("请确认你的密码!\n");
  112.         scanf("%s",password2);
  113.         if(strcmp(password1,password2) == 0)
  114.         {
  115.                 printf("密码设置成功!\n");
  116.         }
  117.         else
  118.         {
  119.                 printf("两次密码不一致!\n");
  120.         N:        printf("请输入序号选择要执行的操作!\n");
  121.                 printf("1.重新输入密码\n2.重新确认密码\n");
  122.                 scanf("%d",&a);
  123.                 if(a == 1)
  124.                 {   
  125.                         printf("请输入密码\n");
  126.                         goto L;
  127.                  }
  128.                  else if(a == 2)
  129.                  {
  130.                          goto M;
  131.                  }
  132.                  else
  133.                  {  
  134.                     printf("请输入正确的序号!\n");
  135.                          goto N;
  136.                  }
  137.                  
  138.         }
  139. }

  140. void JM_D()      // 对D盘解密
  141. {

  142. char name[20],key[20];
  143. char way[20] = "d:\";//设置路径为d盘
  144.         printf("请输入文件名称:\n");//解密步骤。
  145. scanf("%s",name);
  146. strcat(name,".txt");//给文件名加上后缀
  147. strcat(way,name);//添加路径
  148.         FILE *fp4;
  149.         fp4 = fopen(way,"r");
  150.         int i=0,j;
  151. char yw[1000],mw[50];       //yw为文档的内容,mw是解密后的数据
  152. while((yw[i]=fgetc(fp4))!=EOF)
  153. i++;
  154. yw[i]='\0';
  155. fclose(fp4);
  156.         printf("输入你的密码:\n");
  157.         scanf("%s",key);
  158.    for(i=0;i<strlen(yw);i++)      

  159. {
  160.    for( j = 0;j<strlen(key);j++)
  161.         {
  162.                 if(!(yw[i]& 0x80))
  163.                 {
  164.        
  165.                 mw[i]=yw[i]^key[j];
  166.                 }
  167.                 else
  168.                 {
  169.                         mw[i]=yw[i];
  170.                 }
  171.         }
  172.         j = 0;
  173. }
  174. printf("\n解密密文:\n");puts(mw);

  175. }

  176. void JM_E()      // 对E盘解密
  177. {

  178. char name[20],key[20];
  179. char way[20] = "e:\";//设置路径为e盘
  180.         printf("请输入文件名称:\n");//解密步
  181. scanf("%s",name);
  182. strcat(name,".txt");//给文件名加上后缀
  183. strcat(way,name);//添加路径
  184.         FILE *fp4;
  185.         fp4 = fopen(way,"r");
  186.         int i=0,j;
  187. char yw[1000],mw[50];       //yw为文档的内容,mw是解密后的数据
  188. while((yw[i]=fgetc(fp4))!=EOF)
  189. i++;
  190. yw[i]='\0';
  191. fclose(fp4);
  192.         printf("输入你的密码:\n");
  193.         scanf("%s",key);
  194.    for(i=0;i<strlen(yw);i++)      

  195. {
  196.    for( j = 0;j<strlen(key);j++)
  197.         {
  198.         if(!(yw[i]& 0x80))
  199.                 {
  200.        
  201.                 mw[i]=yw[i]^key[j];
  202.                 }
  203.                 else
  204.                 {
  205.                         mw[i]=yw[i];
  206.                 }
  207.         }
  208.         j = 0;
  209. }
  210. printf("\n解密密文:\n");puts(mw);

  211. }


  212. main()
  213. {
  214. while(1)
  215.       {
  216.             system("color 04");
  217.                  system("cls");//清屏
  218.                 N:        int a=0,b = 0,c = 0;     //a为存储序号,b为解密序号
  219.                            //此处应有加密与解密选择,未完成
  220.                             printf("请选择你的功能\n");
  221.                             printf("1.创建加密文件     2.解密文件    3.退出程序\n");
  222.                             scanf("%d",&c);
  223.         if(c == 1)
  224.         {
  225.         printf("选择存储空间(对应序号):1.D盘;2.E盘\n");
  226.         scanf("%d",&a);                     

  227.         while (a!=1&&a!=2)
  228.         {
  229.                 printf("请重新输入正确的序号!\n");
  230.                  scanf("%d",&a);
  231.         }
  232.         switch(a)                               //存储盘选择系统
  233.         {
  234.                 case 1:BUILD_D();
  235.                 break;
  236.                 case 2 :BUILD_E();
  237.                 break;
  238.          }

  239. FILE *p;                                       //读取创立的文档
  240. p=fopen(way2,"r");
  241. int i=0,j;
  242. char yw[1000],mw[50];       //yw为文档的内容,mw是加密后的数据
  243. while((yw[i]=fgetc(p))!=EOF)
  244. i++;
  245. yw[i]='\0';
  246. fclose(p);


  247.         printf("请创建你的密码:\n");
  248.        
  249.          password_check();   //执行密码判断程序
  250.                          
  251.      printf("请牢记你的密码:\n%s\n",password2);
  252.        


  253. printf("原文:\n");puts(yw);          //输出读取的数据

  254. for(i=0;i<strlen(yw);i++)

  255. {
  256.         for( j = 0;j<strlen(password2);j++)
  257.         {

  258.         if(!(yw[i]& 0x80)&&yw[i]!=3)
  259.                 {
  260.         mw[i]=yw[i]^password2[j];
  261.                 }
  262.                 else
  263.                 {
  264.                         mw[i]=yw[i];
  265.                 }
  266.         }
  267.         j = 0;

  268. }

  269. printf("\n密文:\n");puts(mw);    //输出密文,确保加密成功
  270.     FILE *fp3 ;                    //将密文覆盖写入
  271.         fp3 = fopen(way2,"w");  
  272.         fputs(mw,fp3);
  273.         fclose(fp3);
  274. printf("\n加密完成!\n");
  275. }
  276.    else if(c == 2)
  277.    {printf("选择解密盘\n");    //选择解密盘
  278. printf("1.D盘   2.E盘\n");
  279. scanf("%d",&b);
  280.         while (b!=1&&b!=2)
  281.         {
  282.                 printf("请重新输入正确的序号!\n");
  283.                  scanf("%d",&b);
  284.         }
  285.         switch(b)                               //解密盘选择系统
  286.         {
  287.                 case 1:JM_D();
  288.                 break;
  289.                 case 2 :JM_E();
  290.                 break;
  291.          }
  292.             
  293.     }
  294.     else if(c == 3)
  295.         {
  296.                 system("taskkill -f -im 课设修改.exe");
  297.                 break;
  298.          }
  299.     else
  300.     {
  301.             printf("请输入正确的序号!\n");
  302.             goto N;
  303.         }
  304.         SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 6);//字体颜色
  305.         printf("5秒后返回主菜单!\n");
  306.     Sleep(5000);
  307. }
  308. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-1-28 14:34:46 | 显示全部楼层
加密:将输入的文字异或一次就行了
解密:将用异或加密的文字再异或一次
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-2 02:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表