Как получить IV и ключ для crypto.createCipheriv для дешифрования?

Michael спросил: 03 февраля 2018 в 01:05 в: node.js

Я видел другие вопросы, которые задают вопрос о создании вектора инициализации (IV) для шифрования , и кажется, что использование случайного значения является одним из вариантов. Тем не менее, мне нужно сгенерировать IV для дешифрования, поэтому я должен использовать тот же самый, который был зашифрован данными на основе некоторой соли.

Функция криптографической функции node.js createDecipher гласит:

Реализация crypto.createDecipher () выводит ключи с использованием функции OpenSSL EVP_BytesToKey с алгоритмом дайджеста, установленным в MD5, одной итерацией и без соли.

Для обратной совместимости с активы, зашифрованные другим программным обеспечением, мне нужно другое количество итераций и соль, которую я указываю.

Продолжая читать документацию, он далее говорит:

В строке с рекомендацией OpenSSL использовать PBKDF2 вместо EVP_BytesToKey рекомендуется, чтобы разработчики извлекали ключ и IVon самостоятельно, используя crypto.pbkdf2 (), и использовали crypto.createDecipheriv () для создания объекта Decipher.

Хорошо, это звучит хорошо. Данные, которые мне нужно расшифровать, были зашифрованы с помощью EVP_BytesToKey, чтобы получить ключ и IV, поэтому мне нужно быть совместимым с этим.

Во всяком случае, функция crypto.pbkdf2, похоже, принимает все необходимые мне параметры это проблема, но проблема в том, что она не создает вектор инициализации.

Соответствующий код C, который расшифровывал, что это должно быть совместимо, выглядит следующим образом:

// parameters to function:
// unsigned char *decrypt_salt
// int nrounds
// unsigned char *decrypt_key_data  <- the password
//  int decrypt_key_data_len <- password length// the following is not initialized before the call to EVP_BytesToKey
unsigned char decrypt_key[32], decrypt_iv[32];EVP_BytesToKey(EVP_aes_256_cbc(), EVP_md5(), decrypt_salt, decrypt_key_data,
                   decrypt_key_data_len, nrounds, decrypt_key, decrypt_iv);

Моя попытка использовать crypto.pbkdf2 для репликации этого поведения:

crypto.pbkdf2(password, salt, nrounds, 32, "md5", (err, derivedKey) => {
    if (err) throw err
    console.log(derivedKey.toString("hex"))
})

derivedKey также не соответствует ключ, созданный кодом C выше. Я не уверен, что это даже ожидается! Я также пробовал ключевые длины 48 и 64, но они не генерировали ничего похожего на ожидаемый ключ и IV.

Учитывая правильные пароли, соли и хеширование раундов, как мне создать тот же ключ и IV для расшифровки с помощью?

0 ответов