Подскажите почему неправильно генерируется ключ утилитой openssl

Рейтинг: 0Ответов: 1Опубликовано: 10.03.2023

Написал утилитку на С, для генерации ключа, посредством пароля и соли, пробую, получаю одни данные, пробую тот же самый как мне кажется алгоритм, для генерации родной утилиткой openssl и получаю совсем другие данные, как только не пробовал, я не могу получить тот же ключ, который нужен, и не могу понять, что я делаю не так.

Вот код на Си:

  int i, nrounds = 5;
  unsigned char key[32], iv[32];
  unsigned char salt[] = { 0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};
  unsigned char encryptKey[] = "ThisIsKey";

  i = EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1(), salt, encryptKey, strlen((const char *)encryptKey), nrounds, key, iv);
  if (i != 32) {
    printf("Key size is %d bits - should be 256 bits\n", i);
    return -1;
  }

  printf("[+] Salt => ");
    for (int i = 0;i < 8;i++) {
        printf("%02X", salt[i]);
    }

    printf("\n[+] KEY => ");
    for (int i = 0;i <= 32;i++) {
        printf("%02X", key[i]);
    }

    printf("\n[+] IV => ");
    for (int i = 0;i <= EVP_MAX_IV_LENGTH;i++) {
        printf("%02X", iv[i]);
    }
    printf("\n");

Получаю:

[+] Salt => 1122334455667788
[+] KEY => F3A2F8BE2C1E943FC8FF403D42D9D9F4D38300032D24CBDE964DBC5FAED4966524
[+] IV => 2492C4DFC355EEC2F960B439C658B64188

А вот так пытаюсь в консоли: openssl aes-256-cbc -pass pass:ThisIsKey -S 1122334455667788 -P -md sha1 -iter 5

salt=1122334455667788
key=56216ECD63F164A4C23C425EB415534AB17F29BAC799C1346B4B88E31951C5DA
iv =80AFEF375648F9EEBB2AE82B802F15CE

Ответы

▲ 2

При использовании openssl опцией --iter вместо EVP_BytesToKey используется PKCS5_PBKDF2_HMAC

const EVP_CIPHER *cipher = EVP_get_cipherbyname("aes-256-cbc");
const EVP_MD *dgst = EVP_get_digestbyname("sha1");

unsigned char tmpkeyiv[EVP_MAX_KEY_LENGTH + EVP_MAX_IV_LENGTH];

int iklen = EVP_CIPHER_get_key_length(cipher);
int ivlen = EVP_CIPHER_get_iv_length(cipher);

PKCS5_PBKDF2_HMAC(encryptKey, strlen(encryptKey), salt, sizeof(salt), nrounds, dgst, iklen+ivlen, tmpkeyiv)

memcpy(key, tmpkeyiv, iklen);
memcpy(iv, tmpkeyiv+iklen, ivlen);