【发布时间】:2015-02-28 11:57:43
【问题描述】:
我在玩这样非常简单的加密/解密算法;
#include <stdio.h>
#include <stdlib.h>
#define BUFFESIZE 1024
int main(int argc, char *argv[]) {
int keylen = 0;
char *key = argv[1];
char *buffer = NULL;
size_t buffersize = 0;
size_t nbytes = 0;
size_t nread;
int i = 0;
while(*key++ != 0) keylen++;
key = argv[1];
do {
buffersize+=BUFFESIZE;
buffer = realloc(buffer, buffersize);
nread = fread(buffer+nbytes, 1, BUFFESIZE, stdin);
nbytes+=nread;
} while (nread > 0);
for(i=0; i<nbytes; i++) {
putchar(buffer[i] ^ key[i % keylen]);
}
return 0;
}
加密密钥是程序的第一个命令行参数。我希望这应该在用相同的密钥加密/解密时得到我的原始文件。但是,如果我对它进行加密/解密,有时我只能取回少量文件。我的猜测是算法在文件中间添加了 EOF 控制字符。
我怎样才能解决这个问题?
我在 Windows XP 上使用 MinGW gcc 4.8.1 编译了这个。如果您有兴趣,可以在the edit history of this question 中找到演示问题的示例输入文件。
【问题讨论】:
-
您的代码对我来说很好(在 Linux / GCC 上)。您使用的是什么操作系统和编译器?此外,如果您可以粘贴一个简短的文件示例和说明问题的密钥,这将有所帮助。
-
无论如何,你可能想试试setting stdin and stdout to binary mode.
-
我猜 ciphertext 中有一个
00值的字节,其余的没有被读取。 -
@Maarten:实际上,对于
fread(),空值不是问题。然而,显然,在文本模式下的 WINdows 上,Ctrl-Z 字符 (0x1A) 是。 -
@IlmariKaronen 呃,这是我脑海中 Windows 怪异表中的另一个条目。不断成长,希望有一天我能把它放到
{any folder at all}/NUL。
标签: c encryption stdio