guhusf 发表于 2021-1-27 10:54:26

数字异或加密求助

本帖最后由 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);
}
}

风过无痕1989 发表于 2021-1-28 14:34:46

加密:将输入的文字异或一次就行了
解密:将用异或加密的文字再异或一次
页: [1]
查看完整版本: 数字异或加密求助