Получение ключа и iv для дешифрования openssl AES - PullRequest
0 голосов
/ 24 марта 2019

Я пытаюсь расшифровать операцию AES с использованием функций openssl из кода C, но это не удается.

Используя инструменты командной строки openssl, я могу успешно расшифровать BLOB-объект.

openssl enc -d -p -aes-256-cbc -md md5 -in encrypted_file -out clear_file -pass file:./key_file -v

Приведенная выше команда работает нормально.

Но когда я использую функции openssl C, чтобы сделать то же самое, это терпит неудачу. Похоже, ошибка связана с неправильным ключом и iv, полученными из passwd и salt.

unsigned char key[32];
unsigned char iv[16];
EVP_BytesToKey(EVP_aes_256_cbc(), EVP_md5(), salt, key_file_buf, key_size, 1, key, iv);

[key_file_buf - это буфер без знака, считанный из key_file.]

Hexdump of salt и key_file_buf совпадает с тем, что используется в командной строке. Размер также правильный. (45 байт в моем случае.)

Что может быть не так с использованием EVP_BytesToKey () для возврата неправильного ключа и iv?

Я попытался поэкспериментировать со значениями счетчика iter, но ни один из них, похоже, не сгенерировал рабочий ключ и iv. Я предполагаю, что счетчик иттеров по умолчанию в командной строке равен 1.

Также подтверждается, если я перезаписываю то, что возвращается из EVP_BytesToKey () и массивов символов без знака с жестким кодом с рабочим ключом и iv, показанными из командной строки, остальная часть моего кода работает нормально и расшифровывается правильно.

Для информации, как выглядит остальная часть кода (скопировано из разных источников, примеры в Интернете)

EVP_CIPHER_CTX_new();
if(ctx == NULL) {
    printf("Error with EVP_CIPHER_CTX_new.\n");
    return;
}    

if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv)) {
    printf("Error initialising decrypted data.\n");
    return;
}    

if(1 != EVP_DecryptUpdate(ctx, clear_data, (int *)&interm_len, &enc_data[salt_size], enc_size)) {
    printf("Error decrypting data.\n");
    return;
}    

*clear_size = interm_len;

if(1 != EVP_DecryptFinal_ex(ctx, clear_data + interm_len, (int *)&interm_len)) {
    printf("Error decrypting data.\n");
    return;
}    
*clear_size += interm_len;

EVP_CIPHER_CTX_free(ctx);

Может кто-нибудь помочь, пожалуйста?

1 Ответ

0 голосов
/ 25 марта 2019

разобрался наконец-то!Должно быть

EVP_BytesToKey(EVP_aes_256_cbc(), EVP_md5(), salt, key_file_buf, (key_size-1), 1, key, iv);

Как объяснено в документации openssl

file: pathname первая строка pathname - это пароль.Если для аргументов -passin и -passout указывается один и тот же аргумент pathname, то для входного пароля будет использоваться первая строка, а для выходного - следующая.

Мой файл passwd заканчивается новой строкой 0x0A,Таким образом, я удалил это из буфера для EVP_BytesToKey (), и он возвращает правильный ключ & iv и расшифровывает теперь отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...