数字异或加密求助
本帖最后由 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,password2,way2;
void BUILD_D() //D盘建立文件
{
FILE *fp;
char name,text;
char way = "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,text;
char way = "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' && password1<='9') //判断第一位是否为字母,不是则重新输入密码
{
printf("首字母必须是字母!\n");
printf("请重新输入密码!");
scanf("%s",password1);
}
while(password1 != '\0')
{
if (password1>= '0' && password1<='9') //统计数字数量
{
num++;
}
else if(password1>='a'&&password1<='z'||password1>='A'&&password1<='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,key;
char way = "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,mw; //yw为文档的内容,mw是解密后的数据
while((yw=fgetc(fp4))!=EOF)
i++;
yw='\0';
fclose(fp4);
printf("输入你的密码:\n");
scanf("%s",key);
for(i=0;i<strlen(yw);i++)
{
for( j = 0;j<strlen(key);j++)
{
if(!(yw& 0x80))
{
mw=yw^key;
}
else
{
mw=yw;
}
}
j = 0;
}
printf("\n解密密文:\n");puts(mw);
}
void JM_E() // 对E盘解密
{
char name,key;
char way = "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,mw; //yw为文档的内容,mw是解密后的数据
while((yw=fgetc(fp4))!=EOF)
i++;
yw='\0';
fclose(fp4);
printf("输入你的密码:\n");
scanf("%s",key);
for(i=0;i<strlen(yw);i++)
{
for( j = 0;j<strlen(key);j++)
{
if(!(yw& 0x80))
{
mw=yw^key;
}
else
{
mw=yw;
}
}
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,mw; //yw为文档的内容,mw是加密后的数据
while((yw=fgetc(p))!=EOF)
i++;
yw='\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& 0x80)&&yw!=3)
{
mw=yw^password2;
}
else
{
mw=yw;
}
}
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);
}
} 加密:将输入的文字异或一次就行了
解密:将用异或加密的文字再异或一次
页:
[1]