我的程序从文件HashedPassword.txt检查给定的4位散列,并将其与所有可能的4个大写字母可能性进行比较,这些可能性应该在temp.txt中。
我的问题是,如果我的数组" alpha"大小为13及以下,在这种情况下,我的程序将点击STRCMP if语句并给我正确的密码,该密码对应于HashedPasswords.txt中给出的散列,任何大小为13的数组都将导致STRCMP打印出无停止&# 34; 1"因此找不到匹配。'
我该如何解决这个问题?
P.S我尝试改变line和line2的大小,使它们更大也改变了strcmp的输出。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void E(char *in, char *out);
int main()
{
FILE* file,*fp2,*fp3;
char input[5];
char pass[5];
char alpha[15]="ABCD";//EFGHIJKLMNOPQRSTUVWXYZ";
char compare;
char string[5];
int i,j,k,l,m,a;
size_t lsize=0;
char line[5];
char line2[5];
char output[5];
char newline[2]="\n";
char test[5];
char *r=NULL;
fp2=fopen("HashedPassword.txt","r");
fgets(line2,sizeof(line2),fp2);
printf("%s\n",line2);
fclose(fp2);
file=fopen("temp.txt","w");
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
for(k=0;k<4;k++)
{
for(l=0;l<4;l++)
{
fprintf(file,"%c%c%c%c\n",alpha[i],alpha[j],alpha[k],alpha[l]);
}
}
}
}
fclose(file);
fp3=fopen("temp.txt","r");
while(getline(&r,&lsize,fp3))
{
E(r,output);
printf("%d\n",strcmp(output,line2));
if(!strcmp(output,line2))
{
printf("This is your password: %s\n",r);
break;
}
}
fclose(fp3);
}
void E(char *in, char *out)
{
out[0]=(in[0]&0x80)^(((in[0]>>1)&0x7F)^((in[0])&0x7F));
out[1]=((in[1]&0x80)^((in[0]<<7)&0x80))^(((in[1]>>1)&0x7F)^((in[1])&0x7F));
out[2]=((in[2]&0x80)^((in[1]<<7)&0x80))^(((in[2]>>1)&0x7F)^((in[2])&0x7F));
out[3]=((in[3]&0x80)^((in[2]<<7)&0x80))^(((in[3]>>1)&0x7F)^((in[3])&0x7F));
}
答案 0 :(得分:3)
首先:output
的长度为5,但您只需在E()
中设置前四个字符,这意味着output[4]
包含随机垃圾(无论发生在该特定情况中)记忆的字节)。 strcmp
比较两个以空字符结尾的字符串,因此您应确保ouput[4] = '\0'
至少完成一次。使用strncmp
并提供长度(例如strncmp(output, line2, sizeof(output))
也可以稍微好一点,以确保在错误的空终止时它不会完全变通。
更改局部变量的大小会影响堆栈output
上的确切位置,这将影响output[4]
的内容会影响strcmp
的结果