проблема бинарного шифрования файлов - PullRequest
0 голосов
/ 04 августа 2010

У меня возникла проблема при шифровании некоторых данных в файле. Я использую простой XOR для этого. допустим, у меня есть эта структура:

struct MyFile{
char fileName[128];
int account;
float balance;};

сохранение этого в виде двоичного файла работает правильно, но когда я использую xor для шифрования имени файла в структуре и сохраняю структуру в hd, то чтение структуры и расшифровка имени файла не показывают символы правильно. Я использую эту простую функцию для целей шифрования / дешифрования.

static void Codec(const char *key,int keySize,char* in,char *result,int length)  
{
    for(int i=0;i<length;i++)
        result[i]=in[i]^key[i%keySize];
}

Обратите внимание, что когда я шифрую имя файла и непосредственно дешифрую его в памяти, результат будет правильным. что я пропускаю, например, почему он изменяется при сохранении на жестком диске. Пожалуйста, ответьте как можно скорее и TNX заранее ...

Ответы [ 3 ]

2 голосов
/ 04 августа 2010

Вы должны открыть файл в двоичном режиме.Если вы используете CI / O (как я обычно это делаю), это означает

FILE *input_file = fopen(input_file_name, "rb");
FILE *output_file = fopen(output_file_name, "wb");

Если вместо этого вас обманули с использованием потоков C ++, это означает

std::ifstream input_file(input_file_name, ios::in | ios::binary);
std::ofstream output_file(output_file_name, ios::out | ios::binary);
2 голосов
/ 04 августа 2010

Сначала определите, действительно ли данные изменяются при записи на диск. Пусть ваша программа распечатает строку в следующих четырех местах:

  1. Перед шифрованием
  2. После шифрования, но перед записью на диск
  3. После чтения с диска, но перед расшифровкой
  4. После расшифровки

Являются ли результаты № 2 и № 3 одинаковыми? Если это так, то файл не изменяется во время передачи на диск и обратно.

Если # 2 и # 3 отличаются, попробуйте записать незашифрованную строку на диск и прочитать ее обратно. Это работает успешно?

Запишите только одну такую ​​структуру в файл и проверьте содержимое файла в шестнадцатеричном редакторе. Как выглядит файл, пока он находится на диске?

Разместите свой код для записи на диск и для чтения с диска, часть проблемы может лежать там.

1 голос
/ 04 августа 2010

Обратите внимание, что вам нужно открывать файлы в двоичном режиме («rb» / «wb» вместо «r» / «w» для fopen). В частности, в реализациях Windows C есть проблемы с преобразованием \n <-> \r\n.

Также рекомендуется использовать unsigned char s для арифметических и побитовых операций; все, кроме 8-разрядных двоичных символов со знаком с двумя дополнительными символами, может вызвать проблемы (которые, конечно, используются большинством реализаций и могут не вызывать проблем с симметричным шифрованием XOR, но все же хорошо быть осторожным)

...