2014-09-01 4 views
2

Я закодирован текстовый файл, используя openssl следующим образом:Первые 16 байт испорченные при расшифровке с использованием AES

openssl enc -nosalt -aes-128-cbc -k mypass -in "test.txt" -out "test_enc.txt" -p 

и возвращает ключ и IV следующим образом:

key=A029D0DF84EB5549C641E04A9EF389E5 
iv =A10CE9C4682486F8622F2F18E7291367 

и вот код Я использовал для decryp файл:

int main() { 

     streampos size; 
     char * indata; 

     ifstream file ("test_enc.txt", ios::in|ios::binary|ios::ate); 
     ofstream outfile ("test_decoded.txt",std::ofstream::binary); 

     if (file.is_open()) 
     { 
     size = file.tellg(); 

     indata = new char [size]; 
     file.seekg (0, ios::beg); 
     file.read (indata, size); 

     file.close(); 

     unsigned char* outdata=new unsigned char [size]; 

     unsigned char ckey[] = "\xA0\x29\xD0\xDF\x84\xEB\x55\x49\xC6\x41\xE0\x4A\x9E\xF3\x89\xE5"; 
     unsigned char ivec[] = "\xA1\x0C\xE9\xC4\x68\x24\x86\xF8\x62\x2F\x2F\x18\xE7\x29\x13\x67"; 

     AES_KEY key; 

     AES_set_decrypt_key(ckey, 256, &key); 

     AES_cbc_encrypt((unsigned char*) indata, outdata, size, &key, ivec, AES_DECRYPT); 


     outfile.write ((char*) outdata,size); 

     delete[] indata; 
     delete[] outdata; 
     } 
     else{ 
      cout << "Unable to open file"; 
      cerr << "Error: " << strerror(errno); 
     } 
     outfile.close(); 
     file.close(); 
     return 0; 
} 

Этот код работает отлично. Однако, когда я использую соль при кодировании, как показано в следующей команде:

openssl enc -aes-128-cbc -k mypass -in "test.txt" -out "test_enc.txt" -p 

и соответственно заменить ключ и ivec в коде, весь файл правильно расшифрованы, но первые 16 байт! Что я узнал из других сообщений с похожими проблемами, я знаю, что значение iv неверно, но я не знаю, что должно быть правильным значением iv. Я использую только ключ и iv значение возврата после шифрования, и я также не учитываю значение соли (на самом деле я не знаю, как это сделать). Какое должно быть правильное значение iv?

ответ

1

Из-за ваших симптомов проблемы, мне кажется, что ваша следующая логика может высвобождать память, которую позднее код в вашей программе читает. Это приводит к этой ситуации. Обычно это происходит из-за того, что после освобождения памяти менеджер кучи обычно пишет какую-то служебную информацию для собственного использования.

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

//Allocate the memory 
unsigned char* outdata=new unsigned char [size]; 

// It appears to me that here the outdata is getting freed. I do not see anywhere 
// else this memory is getting freed. 
AES_cbc_encrypt((unsigned char*) indata, outdata, size, &key, ivec, AES_DECRYPT); 
// Due to this, while accessing it we are seeing the 16 bytes corrupted. 
outfile.write ((char*) outdata,size); 

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

+0

Это определенно утечка памяти, я исправил это в коде сейчас. Но я не думаю, что коррупция была вызвана этим. Я не верю, что это проблема с повреждением памяти, а неправильное дешифрование, потому что я пропускаю что-то на этапе дешифрования. Коррупция происходит только тогда, когда соль добавляется при шифровании и исправлении утечки памяти тоже не помогло, первые 16 байтов все еще повреждены! – user2219907

1

У меня была аналогичная проблема. В моем случае проблема заключалась в том, что IV передал AES_cbc_encrypt изменен во время выполнения алгоритма. Я должен был сохранить копию раньше, чтобы сохранить содержимое IV.

Описывается решение аналогичной проблемы here.