鱼C论坛

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

数字异或加密求助

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

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

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

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);
}
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-28 14:34:46 | 显示全部楼层
加密:将输入的文字异或一次就行了
解密:将用异或加密的文字再异或一次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 04:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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