2010-08-03 3 views
0

У меня возникла проблема при шифровании некоторых данных в файле. Я использую простой 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

Вы не можете использовать тег «encryption», когда вы спрашиваете о вопросе XOR ... Для любого парня вам понадобится около 0,0001 секунды для определения вашего «ключа». –

+1

Как вы пишете/читаете файл? И @ Ремус, похоже, он использует одноразовый блокнот, так как его код использует поток ключей. Это технически безопасно, если он не использует ключ повторно.EDIT: oh, если он не использует ключ короче, чем файл. Тогда да, это будет смешно легко выяснить. – Xzhsh

+0

Попробуйте использовать его с нулями для ключа - работает ли ваш алго? –

ответ

1

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

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

2

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

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

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

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

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

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

2

Вы должны открыть файл в двоичном режиме. Если вы используете 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); 
Смежные вопросы