цель c — шифрование Blowfish с помощью кода c ++ в проекте какао

Я хотел бы зашифровать текст с помощью класса Брюса Шнайера, который был преобразован в код c ++ Джимом Конгером. После шифрования я хотел бы расшифровать зашифрованный текст. Чтобы попробовать это, я использую файлы для этого. Я создал пример проекта, но расшифрованный файл не содержит того же текста, что и исходный файл. В чем может быть проблема?

Вот скачать ссылка на сайт для файлов класса Blowfish.

Я создал 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;
}

0

Решение

Вы используете блочный шифр с заполнением (посмотрите на исходный код CBlowFish::Encode) для шифрования потока. Вы не можете сделать это, потому что операция дешифрования не сможет узнать, что представляет собой дополненный фрагмент, который он должен дешифровать.

Например, допустим, что вы шифруете «FOOBAR», но вы читаете «FOO» в первый раз, а это шифрует «XYZZY». Затем вы шифруете «BAR» в «ABCDE». Ваш письменный файл будет содержать «XYZZYABCDE». Но это «XY» «ZZYA» «BCDE»? Или один блок «XYZZYABCDE» или что?

Если вы хотите зашифровать поток, используйте потоковый шифр. Или, если вы хотите разрезать его на произвольные блоки, вы должны сохранить границы выходных блоков, чтобы вы могли расшифровать блоки.

1

Другие решения

Вы ДОЛЖНЫ кодировать / декодировать соответствующие блоки данных. fread () и fwrite () не возвращают одно и то же нет. байтов (результат), так что ваши обычные текстовые блоки и ваши зашифрованные текстовые блоки не выровнены.

Определяет длину блока данных (скажем, 64 байта) и придерживается ее при кодировании и декодировании.

В противном случае используйте потоковый шифр, который использует «блоки данных» в 1 байт;)

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector