鱼C论坛

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

请问怎样将异或加密后得到的乱码保存进文本文档?

[复制链接]
发表于 2021-1-25 13:14:41 | 显示全部楼层 |阅读模式
6鱼币
本帖最后由 guhusf 于 2021-1-26 18:03 编辑

写了个加密文本文档的程序,发现创建文件并异或加密后,只有原英语字符对应的加密乱码可以保存进文本文档里,并能另外读取并用异或解密,数字和汉字的乱码却不能保存和异或解密,怎么办呢?
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<string.h>
  4.         char password1[20],password2[20],way2[20];
  5. void BUILD_D()                          //D盘建立文件
  6. {
  7. FILE *fp;
  8. char name[20],text[1000000];
  9. char way[20] = "d:\";//设置路径为d盘
  10. printf("请输入文件名称:\n");
  11. scanf("%s",name);
  12. strcat(name,".txt");//给文件名加上后缀
  13. strcat(way,name);//添加路径
  14. strcpy(way2,way);
  15. fp = fopen(way,"w");
  16. printf("请输入内容:\n");
  17. while(1)
  18. {

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

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

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

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

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

  158. {
  159.    for( j = 0;j<strlen(key);j++)
  160.         {
  161.         mw[i]=yw[i]^key[j];
  162.         }
  163.         j = 0;
  164. }
  165. printf("\n解密密文:\n");puts(mw);

  166. }

  167. void JM_E()      // 对E盘解密
  168. {

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

  186. {
  187.    for( j = 0;j<strlen(key);j++)
  188.         {
  189.         mw[i]=yw[i]^key[j];
  190.         }
  191.         j = 0;
  192. }
  193. printf("\n解密密文:\n");puts(mw);

  194. }
  195. main()
  196. {

  197.                 N:        int a=0,b = 0,c = 0;     //a为存储序号,b为解密序号
  198.                           
  199.                             printf("请选择你的功能\n");
  200.                             printf("1.创建加密文件     2.解密文件\n");
  201.                             scanf("%d",&c);
  202.         if(c == 1)
  203.         {
  204.         printf("选择存储空间(对应序号):1.D盘;2.E盘\n");
  205.         scanf("%d",&a);                     

  206.         while (a!=1&&a!=2)
  207.         {
  208.                 printf("请重新输入正确的序号!\n");
  209.                  scanf("%d",&a);
  210.         }
  211.         switch(a)                               //存储盘选择系统
  212.         {
  213.                 case 1:BUILD_D();
  214.                 break;
  215.                 case 2 :BUILD_E();
  216.                 break;
  217.          }

  218. FILE *p;                                       //读取创立的文档
  219. p=fopen(way2,"r");
  220. int i=0,j;
  221. char yw[1000],mw[50];       //yw为文档的内容,mw是加密后的数据
  222. while((yw[i]=fgetc(p))!=EOF)
  223. i++;
  224. yw[i]='\0';
  225. fclose(p);


  226.         printf("请创建你的密码:\n");
  227.        
  228.          password_check();   //执行密码判断程序
  229.                          
  230.      printf("请牢记你的密码:\n%s\n",password2);
  231.        


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

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

  234. {
  235.         for( j = 0;j<strlen(password2);j++)
  236.         {
  237. mw[i]=yw[i]^password2[j];
  238.         }
  239.         j = 0;

  240. }

  241. printf("\n密文:\n");puts(mw);    //输出密文,确保加密成功
  242.     FILE *fp3 ;                    //将密文覆盖写入
  243.         fp3 = fopen(way2,"w");  
  244.         fputs(mw,fp3);
  245.         fclose(fp3);
  246. printf("\n加密完成!\n");
  247. }
  248.    else if(c == 2)
  249.    {printf("选择解密盘\n");    //选择解密盘
  250. printf("1.D盘   2.E盘\n");
  251. scanf("%d",&b);
  252.         while (b!=1&&b!=2)
  253.         {
  254.                 printf("请重新输入正确的序号!\n");
  255.                  scanf("%d",&b);
  256.         }
  257.         switch(b)                               //解密盘选择系统
  258.         {
  259.                 case 1:JM_D();
  260.                 break;
  261.                 case 2 :JM_E();
  262.                 break;
  263.          }
  264.             
  265.     }
  266.     else
  267.     {
  268.             printf("请输入正确的序号!\n");
  269.             goto N;
  270.         }
  271. }

复制代码

解密数字失败

解密数字失败

创建和加密数字,发现生成的密文有问题

创建和加密数字,发现生成的密文有问题
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-1-27 15:21:46 | 显示全部楼层
本帖最后由 jackz007 于 2021-1-28 11:29 编辑

       咱有万能的 Base64 啊,Base64 是一种利用 64 个可打印字符来表示任意二进制数据的方法,是专门用来在互联网上用文本传递二进制数据的编、解码算法。通过 Base64,你甚至可以把一个可执行文件变成文本文件。然后,通过 Base64 解码,完全还原出可执行文件。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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