Несоответствие OpenSSL EVP API и CLI для AES256

#c #encryption #openssl

#c #шифрование #openssl

Вопрос:

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

Для шифрования я использую этот пример C и OpenSSL EVP: https://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption#Encrypting_the_message

И он вызывается следующим образом:

 ....
#include <openssl/conf.h>
#include <openssl/evp.h>
#include <openssl/err.h>
....

int main()
{
    char ciphertext[1024];
    static char *enckey = (char *) "7c07f68ea8494b2f8b9fea297119350d78708afa69c1c7600000000000000000";
    static char *iv = (char *)"FEDCBA09876543210000000000000000";
    size_t* output_length;
    
    ssize_t crypto_length = encrypt("test", 4, enckey, iv, ciphertext);
    
    printf("%s", base64_encode(ciphertext, crypto_length, output_length) );
}
  

Для OpenSSL CLI я использую:

 openssl enc -aes-256-cbc -e -a -A -in input.dat 
  -K 7c07f68ea8494b2f8b9fea297119350d78708afa69c1c7600000000000000000 -iv FEDCBA09876543210000000000000000
  

Идентичный ключ, IV, открытый текст (ввод.dat имеет только «test» внутри (без кавычек)), идентичный режим — AES-256-CBC.

И все же я получаю два разных вывода:

  • EVP C: HBy5KT15kp dLFuBNU15rw==
  • CLI: zcTjiVTkZI8XSpDbc0HvRA== (Я получаю то же самое с программой Java с теми же параметрами)

Есть идеи, почему они будут генерировать разные выходные данные, и поэтому выходные данные EVP не могут быть расшифрованы в CLI.

Комментарии:

1. Я не вижу никакого кода EVP, он должен быть в encrypt() методе.

2. Однако вам придется явно декодировать этот ключ и IV в шестнадцатеричном виде в вашем коде на C. CLI сделает это за вас.

3. Спасибо, это исправляет проблему.

4. статический символ *Ив = к (char *)»xFEв xdcнаушникиx09x87, такх65х43Х21х00х00х00х00х00х00х00х00″;