0

Jim Conger によって C++ コードに変換された Bruce Schneier のクラスでテキストを暗号化したい 暗号化した後、暗号化されたテキストを解読したいと考えています。これを試すために、ファイルを使用しています。サンプル プロジェクトを作成しましたが、復号化されたファイルに最初のファイルと同じテキストが含まれていません。何が問題になる可能性がありますか?

フグのクラス ファイルのダウンロードリンクは次のとおりです。

Command line toolXCode でプロジェクトを作成し、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」ですか?または1つのブロック、「XYZZYABCDE」または何ですか?

ストリームを暗号化する場合は、ストリーム暗号を使用します。または、任意のブロックに分割する場合は、ブロックを復号化できるように、出力ブロックの境界を保持する必要があります。

于 2012-11-23T23:27:29.110 に答える
1

対応するデータ ブロックをエンコード/デコードする必要があります。fread() と fwrite() は同じ番号を返しません。バイト数 (結果) であるため、プレーンテキスト データ ブロックと暗号テキスト データ ブロックが整列していません。

データ ブロックの長さ (たとえば 64 バイト) を定義し、エンコードおよびデコードするときにそれに従います。

それ以外の場合は、1 バイトの「データ ブロック」を使用するストリーム暗号を使用してください ;)

于 2012-11-23T23:30:29.673 に答える