Декриптиране на файл в C++, който е криптиран с openssl -aes-128-cbc

Опитвам се да дешифрирам файл на C++. Този файл е шифрован със следната команда:

openssl enc -nosalt -aes-128-cbc -pass pass:test -in "test.txt" -out "test_enc.txt" -p

Конзолата показва key=098F6BCD4621D373CADE4E832627B4F6 и iv=0A9172716AE6428409885B8B829CCB05.

В C++ съм включил реда #include openssl/aes.h и се опитвам да дешифрирам със следния код:

const char *indata = string.toAscii().constData();

unsigned char outdata[strlen(indata)];

unsigned char ckey[] = "098F6BCD4621D373CADE4E832627B4F6";
    unsigned char ivec[] = "0A9172716AE6428409885B8B829CCB05";

    /* data structure that contains the key itself */
    AES_KEY key;

    /* set the encryption key */
    AES_set_decrypt_key(ckey, 256, &key);

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

    QString result = QString((const char*) outdata);

    return result;

Променливата outdata съдържа различна стойност от преди криптирането с OpenSSL.


person user2932510    schedule 29.10.2013    source източник
comment
Всъщност не си задал въпрос.   -  person benjymous    schedule 29.10.2013
comment
Въпросът е: Защо изходът на AES_cbc_encrypt е различен от входа на openssl enc... преди? Защо съдържанието преди криптирането е различно от съдържанието след декриптирането?   -  person user2932510    schedule 29.10.2013


Отговори (2)


Посочвате -aes-128-cbc като опция на OpenSSL, така че ключът и векторът за инициализация ще бъдат с дължина 128 бита. openssl ги отпечатва като шестнадесетични низове, тъй като те ще бъдат объркани в конзолата, ако бъдат отпечатани двоично.

Затова трябва да инициализирате вашите ckey[] и ivec[] като двоична стойност на шестнадесетичните низове по следния начин:

unsigned char ckey[] = "\x09\x8F\x6B\xCD\x46\x21\xD3\x73\xCA\xDE\x4E\x83\x26\x27\xB4\xF6";
unsigned char ivec[] = "\x0A\x91\x72\x71\x6A\xE6\x42\x84\x09\x88\x5B\x8B\x82\x9C\xCB\x05";

и също така използвайте дължина на ключа 128 вместо 256 в:

AES_set_decrypt_key(ckey, 128, &key);
person Ebbe M. Pedersen    schedule 29.10.2013
comment
Сега след дешифрирането имам някои нови знаци. Криптирах теста на низа и след дешифрирането низът test (бял 1 знак за интервал и 8 раздела отзад) е в новия файл. - person user2932510; 04.11.2013
comment
Ако горният отговор е разрешил проблема ви, моля, приемете отговора. Ако имате нови проблеми с нов тест, можете да създадете нов въпрос. - person Ebbe M. Pedersen; 04.11.2013

OpenSSL създава ключа, използвайки паролата, която предлагате, а също и векторът, който сте посочили, е свързан с декриптиране и криптиране. Уверете се, че имате същия ключ и вектор, докато дешифрирате текста.

person albert    schedule 29.10.2013
comment
Използвам същия ключ и ivec за дешифриране, който беше генериран от openssl enc с парола. В този пример промених паролата за тестване, а не ключа/ivac в моята функция за декодиране. Мисля, че проблемът е свързан с разликата между алгоритъма в openssl и AES_cbc_encrypt. - person user2932510; 29.10.2013