Я пытаюсь расшифровать операцию 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);
Может кто-нибудь помочь, пожалуйста?