0

我想用 Bruce Schneier 的课程加密一个文本,该课程由 Jim Conger 转换为 c++ 代码加密后我想解密加密的文本。为了尝试这一点,我正在使用文件。我创建了一个示例项目,但解密的文件不包含与初始文件相同的文本。可能是什么问题?

这是河豚类文件的下载链接

Command line tool在 XCode 中创建了一个项目并将main.m文件更改为main.mm. 在这里你可以找到我的main.mm文件内容:

#import "blowfish.h"
#include <stdlib.h>
#include <stdio.h>

#define my_fopen(fileptr, filename, mode) \
fileptr = fopen(filename, mode); \
if (fileptr == NULL) { \
fprintf(stderr, "Error: Couldn't open %s.\n", filename); \
exit(1); \
}

const char *input_file_name = "test.txt";
const char *encoded_file_name = "encoded.txt";
const char *decoded_file_name = "decoded.txt";
unsigned char key[] = "thisisthekey";

int main(void) {
    FILE *infile, *outfile;
    int result, filesize;
    const int n = 8; // make sure this is a multiple of 8
    const int size = 1;
    unsigned char input[n], output[n];

    CBlowFish bf;
    bf.Initialize(key, sizeof(key)-1); // subtract 1 to not count the null terminator

    my_fopen(infile, input_file_name, "rb")
    my_fopen(outfile, encoded_file_name, "wb")

    filesize = 0;
    while (result = fread(input, size, n, infile)) {
        filesize += result;
        fwrite(output, size, bf.Encode(input, output, result), outfile);
    }

    fclose(outfile);
    fclose(infile);

    my_fopen(infile, encoded_file_name, "rb")
    my_fopen(outfile, decoded_file_name, "wb")

    while (result = fread(input, size, n, infile)) {
        bf.Decode(input, output, result);
        fwrite(output, sizeof(output[0]), filesize < result ? filesize : result, outfile);
        filesize -= result;
    }

    fclose(outfile);
    fclose(infile);

    return 0;
}
4

2 回答 2

1

您正在使用带有填充的分组密码(查看源代码CBlowFish::Encode)来加密流。您不能这样做,因为解密操作将无法知道它应该解密的填充块的构成。

例如,假设您正在加密“FOOBAR”,但您第一次读取“FOO”,这将加密为“XYZZY”。然后将“BAR”加密为“ABCDE”。您的书面文件将包含“XYZZYABCDE”。但那是“XY”“ZZYA”“BCDE”吗?或者一个块,“XYZZYABCDE”还是什么?

如果要加密流,请使用流密码。或者,如果您想将其切成任意块,则必须保留输出块边界,以便解密这些块。

于 2012-11-23T23:27:29.110 回答
1

您必须编码/解码相应的数据块。fread() 和 fwrite() 不返回相同的编号。字节数(结果),因此您的纯文本数据块和密文数据块未对齐。

定义数据块长度(比如 64 字节)并在编码和解码时坚持它。

否则使用使用 1 个字节的“数据块”的流密码;)

于 2012-11-23T23:30:29.673 回答