|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 guhusf 于 2021-1-27 11:09 编辑
各位大佬帮忙看一看,为什么对数字进行加密时,出现数字3就会终止解密?比如我要对数字12456789加密,解密后没有问题,但是数字里出现了3,比如12345678,解密时3及以后的数字都会消失。
- #include <stdio.h>
- #include <stdlib.h>
- #include<string.h>
- #include<windows.h>
- char password1[20],password2[20],way2[20];
- void BUILD_D() //D盘建立文件
- {
- FILE *fp;
- char name[20],text[1000000];
- char way[20] = "d:\";//设置路径为d盘
- printf("请输入文件名称:\n");
- scanf("%s",name);
- strcat(name,".txt");//给文件名加上后缀
- strcat(way,name);//添加路径
- strcpy(way2,way);
- fp = fopen(way,"w");
- printf("请输入内容:\n");
- while(1)
- {
- gets(text);
- if(!strcmp(text,"##"))
- break;
- else
- {
- fputs(text,fp);
- fputs("\n",fp); //用于转行
- }
- }
- fclose(fp);
- }
- void BUILD_E() //E盘建立文件
- {
- FILE *fp;
- char name[20],text[1000000];
- char way[20] = "e:\";//设置路径为d盘
- printf("请输入文件名称:\n");
- scanf("%s",name);
- strcat(name,".txt");//给文件名加上后缀
- strcat(way,name);//添加路径
- strcpy(way2,way);
- fp = fopen(way,"w");
- printf("请输入内容:\n");
- while(1)
- {
- gets(text);
- if(!strcmp(text,"##"))
- break;
- else
- {
- fputs(text,fp);
- fputs("\n",fp); //用于转行
- }
- }
- fclose(fp);
- }
- void password_check() //密码判断程序
- {
- int i,num,letters,all,a; //a用于序号选择
- L: i = 0,num = 0,letters = 0,all = 0,a = 0;
- scanf("%s",password1);
- while (password1[0]>= '0' && password1[0]<='9') //判断第一位是否为字母,不是则重新输入密码
- {
- printf("首字母必须是字母!\n");
- printf("请重新输入密码!");
- scanf("%s",password1);
- }
- while(password1[i] != '\0')
- {
- if (password1[i]>= '0' && password1[i]<='9') //统计数字数量
- {
- num++;
- }
- else if(password1[i]>='a'&&password1[i]<='z'||password1[i]>='A'&&password1[i]<='Z') //统计字母数量
- {
- letters++;
- }
- i++;
- }
- all = num + letters;
- printf("数字个数%d,字母个数%d,总密码长度%d\n",num,letters,all);
- if(all<6) //判断密码长度
- {
- printf("密码长度必须不小于六位!\n");
- printf("请重新输入密码!\n");
-
- goto L;
- }
- else if (num<3 && letters>2) //判断数字数量是否大于2
- {
- printf("数字个数必须大于2!\n");
- printf("请重新输入密码!\n");
-
- goto L;
- }
- else if (letters<3 && num>2) //判断字母数量是否大于2
- {
- printf("字母个数必须大于2!\n");
- printf("请重新输入密码!\n");
-
- goto L;
- }
- else if(num<3 && letters<3) //判断字母和数字数量是否均大于2
- {
-
- printf("字母和数字个数均必须大于2!\n");
- printf("请重新输入密码!\n");
-
- goto L;
-
- }
- M:printf("请确认你的密码!\n");
- scanf("%s",password2);
- if(strcmp(password1,password2) == 0)
- {
- printf("密码设置成功!\n");
- }
- else
- {
- printf("两次密码不一致!\n");
- N: printf("请输入序号选择要执行的操作!\n");
- printf("1.重新输入密码\n2.重新确认密码\n");
- scanf("%d",&a);
- if(a == 1)
- {
- printf("请输入密码\n");
- goto L;
- }
- else if(a == 2)
- {
- goto M;
- }
- else
- {
- printf("请输入正确的序号!\n");
- goto N;
- }
-
- }
- }
- void JM_D() // 对D盘解密
- {
- char name[20],key[20];
- char way[20] = "d:\";//设置路径为d盘
- printf("请输入文件名称:\n");//解密步骤。
- scanf("%s",name);
- strcat(name,".txt");//给文件名加上后缀
- strcat(way,name);//添加路径
- FILE *fp4;
- fp4 = fopen(way,"r");
- int i=0,j;
- char yw[1000],mw[50]; //yw为文档的内容,mw是解密后的数据
- while((yw[i]=fgetc(fp4))!=EOF)
- i++;
- yw[i]='\0';
- fclose(fp4);
- printf("输入你的密码:\n");
- scanf("%s",key);
- for(i=0;i<strlen(yw);i++)
- {
- for( j = 0;j<strlen(key);j++)
- {
- if(!(yw[i]& 0x80))
- {
-
- mw[i]=yw[i]^key[j];
- }
- else
- {
- mw[i]=yw[i];
- }
- }
- j = 0;
- }
- printf("\n解密密文:\n");puts(mw);
- }
- void JM_E() // 对E盘解密
- {
- char name[20],key[20];
- char way[20] = "e:\";//设置路径为e盘
- printf("请输入文件名称:\n");//解密步
- scanf("%s",name);
- strcat(name,".txt");//给文件名加上后缀
- strcat(way,name);//添加路径
- FILE *fp4;
- fp4 = fopen(way,"r");
- int i=0,j;
- char yw[1000],mw[50]; //yw为文档的内容,mw是解密后的数据
- while((yw[i]=fgetc(fp4))!=EOF)
- i++;
- yw[i]='\0';
- fclose(fp4);
- printf("输入你的密码:\n");
- scanf("%s",key);
- for(i=0;i<strlen(yw);i++)
- {
- for( j = 0;j<strlen(key);j++)
- {
- if(!(yw[i]& 0x80))
- {
-
- mw[i]=yw[i]^key[j];
- }
- else
- {
- mw[i]=yw[i];
- }
- }
- j = 0;
- }
- printf("\n解密密文:\n");puts(mw);
- }
- main()
- {
- while(1)
- {
- system("color 04");
- system("cls");//清屏
- N: int a=0,b = 0,c = 0; //a为存储序号,b为解密序号
- //此处应有加密与解密选择,未完成
- printf("请选择你的功能\n");
- printf("1.创建加密文件 2.解密文件 3.退出程序\n");
- scanf("%d",&c);
- if(c == 1)
- {
- printf("选择存储空间(对应序号):1.D盘;2.E盘\n");
- scanf("%d",&a);
- while (a!=1&&a!=2)
- {
- printf("请重新输入正确的序号!\n");
- scanf("%d",&a);
- }
- switch(a) //存储盘选择系统
- {
- case 1:BUILD_D();
- break;
- case 2 :BUILD_E();
- break;
- }
- FILE *p; //读取创立的文档
- p=fopen(way2,"r");
- int i=0,j;
- char yw[1000],mw[50]; //yw为文档的内容,mw是加密后的数据
- while((yw[i]=fgetc(p))!=EOF)
- i++;
- yw[i]='\0';
- fclose(p);
- printf("请创建你的密码:\n");
-
- password_check(); //执行密码判断程序
-
- printf("请牢记你的密码:\n%s\n",password2);
-
- printf("原文:\n");puts(yw); //输出读取的数据
- for(i=0;i<strlen(yw);i++)
- {
- for( j = 0;j<strlen(password2);j++)
- {
- if(!(yw[i]& 0x80)&&yw[i]!=3)
- {
- mw[i]=yw[i]^password2[j];
- }
- else
- {
- mw[i]=yw[i];
- }
- }
- j = 0;
- }
- printf("\n密文:\n");puts(mw); //输出密文,确保加密成功
- FILE *fp3 ; //将密文覆盖写入
- fp3 = fopen(way2,"w");
- fputs(mw,fp3);
- fclose(fp3);
- printf("\n加密完成!\n");
- }
- else if(c == 2)
- {printf("选择解密盘\n"); //选择解密盘
- printf("1.D盘 2.E盘\n");
- scanf("%d",&b);
- while (b!=1&&b!=2)
- {
- printf("请重新输入正确的序号!\n");
- scanf("%d",&b);
- }
- switch(b) //解密盘选择系统
- {
- case 1:JM_D();
- break;
- case 2 :JM_E();
- break;
- }
-
- }
- else if(c == 3)
- {
- system("taskkill -f -im 课设修改.exe");
- break;
- }
- else
- {
- printf("请输入正确的序号!\n");
- goto N;
- }
- SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 6);//字体颜色
- printf("5秒后返回主菜单!\n");
- Sleep(5000);
- }
- }
复制代码 |
|