Расшифровка файла на C++, зашифрованного с помощью openssl -aes-128-cbc

Я пытаюсь расшифровать файл на С++. Этот файл шифруется следующей командой:

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

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

В С++ я включил строку #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, и после расшифровки строка 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 с паролем. В этом примере я изменил пароль на test, а не ключ/ivac в моей функции декодирования. Я думаю, что проблема связана с разницей между алгоритмом в openssl и AES_cbc_encrypt. - person user2932510; 29.10.2013