一个搞笑的C程序,加密解密的,不知道哪里出错了……
下面这个是对应上面的情况运行的结果截屏,并没有全部显示一句话,到y那里就停了,而且只要把y或x放到前面的那个位置,就只显示到y或x的前一个位置的字符:
当密钥1改成89后又出现问题了……
快搞崩溃了……请各位大神指教啊……
#include<stdio.h>
#include<stdlib.h>
int cipt[256][3];//定义全局二维数组cipt,cipt[0]作为标志,为1则为密钥,cipt[1]和cipt[2]用来存储密钥
int fcreatcip(char *fname)
{
FILE *fp;//以下三个字符串为测试的,但为何出现的效果差别很大????
//字符串1
//char c,*str="Evidence of India's slowing economy can be seen from local car dealerships - where auto sales are set to decrease for the first time in 10 years - to job training workshops where unemployed young people like Yogesh Dahiya get interview advice. The New Delhi resident says finding a job in India's retail sector is tough.";
//字符串2
//char c,*str="Evidence of slowing India's economy can be seen from local - car dealershipswhere auto sales are set to decrease for the first time in 10 years - to job training workshops where unemployed young people like Yogesh Dahiya get interview advice. The New Delhi resident says finding a job in India's retail sector is tough.";
//字符串3
//char c,*str="India's Good - morning,deayr professors,It's my great honor to have this chance to be here for this interview.First,I would like to briefly introduce myself.";
int k=1;
int cip[3]={1,99,19};
/*printf("请输入加密密钥:\n");
printf("cip1=");
scanf("%d",&cip[1]);
printf("cip2=");
scanf("%d",&cip[2]);
*/
fp=fopen(fname,"w+");
if(!fp)
{
printf("File open ERROR !\n");
exit(0);
}
do
{
if(k%2!=0) c=*str^cip[1];//如果是奇数位则和cip[1]异或
else c=*str^cip[2];//如果是偶数位则和cip[2]异或
fputc(c,fp);
str++;
k++;
}while(*str!='\0');
printf("Creat File OK !\n");
fclose(fp);
return 1;
}
int isnorcharacter(char c)//判断从文件处理后的字符是否为正常的英文文章中的常见字符,这里简单处理。
{
if((c>='a'&&c<='z')||(c>='A'&&c<='Z')||(c>='1'&&c<='9')||c==' '||c=='\''||c=='"'||c==','||c=='.'||c=='!'||c==':'||c==';'||c=='?'||c=='-'||c=='['||c==']'||c=='('||c==')')
return 1;
else return 0;
}
int iscip(char *fname)//查找密钥
{
int i,j,k,n=0;
FILE *fp;
char c,ct;
fp=fopen(fname,"r");
if(!fp)
{
printf("File open ERROR ! ");
exit(0);
}
for(i=0;i<256;i++)//循环暴力破解
{
for(j=0;j<256;j++)
{
cipt[n][0]=1;
cipt[n][1]=i;
cipt[n][2]=j;
rewind(fp);
c=fgetc(fp);k=1;
while(!feof(fp))
{
if(k%2!=0) ct=c^cipt[n][1];//如果是奇数位则和cip[1]异或
else ct=c^cipt[n][2];//如果是偶数位则和cip[2]异或
if(!isnorcharacter(ct))
{
cipt[n][0]=0;//不是密钥
break;//测试下一个密钥
}
c=fgetc(fp);k+=1;
}
if(cipt[n][0])//如果破解成功
{
//fclose(fp);
//return cip;
n++;
}
}
}
fclose(fp);
return n;//cipt;
//exit(0);
}
void print(int cip[],char *fname)//根据密钥输出第一句话
{
FILE *fp;
char c,ct;
int k;
printf("可能的密钥:\ncip1=%d\ncip2=%d\n",cip[1],cip[2]);
printf("要输出的第一句话为:\n");
fp=fopen(fname,"r");
if(!fp)
{
printf("File open ERRER ! ");
exit(0);
}
c=fgetc(fp);k=1;
while(!feof(fp))
{
if(k%2!=0) ct=c^cip[1];
else ct=c^cip[2];
if(ct!='.'&&ct!='!'&&ct!='\?')//如果不是一句话的结束则继续循环输出
{putchar(ct);//否则输出后退出循环
c=fgetc(fp);k+=1;
}
else
{
putchar(ct);
break;
}
}
putchar('\n');
fclose(fp);
}
void main()
{
char *fname="d:\\tfile\\info.txt";
int i,j,cip[3]={0,0,0};//定义数组cip,cip[0]作为标志,为1则为密钥,cip[1]和cip[2]用来存储密钥
int n,count=0;
for(i=0;i<256;i++)//二维数组cipt的初始化
for(j=0;j<3;j++)
cipt[i][j]=0;
fcreatcip(fname);//创建加密文件
n=iscip(fname);//寻找密钥
for(i=0;i<=n;i++)//循环输出所有密钥(最后输出的一个不是密钥)
for(j=0;j<3;j++)
{
printf("%d\t",cipt[i][j]);count++;
if(count%9==0)
printf("\n");
}
printf("\n");
for(i=0;cipt[i][0]==1;i++)
{
cip[1]=cipt[i][1];
cip[2]=cipt[i][2];
print(cip,fname);//输出第一句话
}
putchar('\n');
} 加密 解密 c 测试
[解决办法]
1. 不太能理解楼主想要问啥。
2. 没进代码框,好难看的。
再不济写个代码思路,再对比代码分析一下...
要是有错,建议楼主先用一个简单的case重现一下错误,再分析问题。
[解决办法]
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待
和
fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了
[解决办法]
一般异或加解密出问题时,都要注意空格问题的处理。
[解决办法]
也许异或的结果是0x1A,被当成文件结束符鸟~~~
[解决办法]
这么多代码,也不格式化一下,多难看啊。
[解决办法]
总之建议 先固定你的cip值,查找到是加密还是解密的问题。