【发布时间】:2021-12-01 11:20:52
【问题描述】:
我正在学习 C,而且学习速度很慢,因为我在自学。我正在尝试创建一个读取文件的小函数,XOR 逐字节对其进行加密,然后将其吐出。它似乎可以用于加密,但是当我解密时只有一半是清晰的,其余的是乱码。
int encrypt_file(void)
{
//declare variables used
FILE *src_file_ptr;
FILE *dst_file_ptr;
char infilename[96];
char key[50];
char outfilename[96];
char temp_store[50];
int plen;
printf("Please enter the name of the file to encrypt: ");
scanf("%s", infilename);
printf("Please enter the name of the output file: ");
scanf("%s", outfilename);
printf("Please enter the key to encrypt the file: ");
scanf("%s", key);
plen = strlen(key);
//test for existence of input file
src_file_ptr = fopen(infilename, "r");
if (src_file_ptr == NULL)
{
printf("File does not exist!");
return 1;
}
dst_file_ptr = fopen(outfilename, "a");
//read and process file 50 bytes at a time
while(fgets(temp_store, 50, src_file_ptr) != NULL)
{
int i;
//XOR n bytes with key
for ( i = 0; i < strlen(temp_store); i++)
{
temp_store[i] = temp_store[i] ^ key[i%plen];
fprintf(dst_file_ptr,"%c",temp_store[i]);
}
}
fclose(dst_file_ptr);
fclose(src_file_ptr);
return 0;
}
int main(void)
{
encrypt_file();
return 0;
}
我在这里对堆栈溢出进行了广泛的研究,我发现的所有内容都是用于 XOR 加密/解密设置值字符串。我试图通过读取文件并要求用户输入密码(密钥)来使其动态工作。任何帮助将不胜感激。
【问题讨论】:
-
解密失败的代码在哪里?
-
你忘记包含你的解密函数了。
-
由于异或的性质,如果你输入相同的密钥,并且加密的字符串会自行反转,在这里找到答案:link
-
请注意,
strlen()停在零处 - 您可能有加密的字符。 -
输入文件可能是文本文件,但输出文件将是二进制文件。所以你不能对它使用字符串操作。你应该用
fgetc()逐个字符地阅读它。