Я видел другие вопросы о создании вектора инициализации (IV) для шифрование, и кажется, что использование случайного значения является одним из вариантов. Однако мне нужно сгенерировать IV для расшифровки, поэтому я должен использовать тот же, которым данные были зашифрованы на основе некоторой соли.
Функция шифрования node.js createDecipher говорит:
Реализация crypto.createDecipher() извлекает ключи с помощью функции OpenSSL EVP_BytesToKey с алгоритмом дайджеста, установленным на MD5, одну итерацию и без соли.
Для обратной совместимости с активами, зашифрованными другим программным обеспечением, мне нужно другое количество итераций и соль, которую я укажу.
Продолжая читать документацию, далее говорится:
В соответствии с рекомендацией OpenSSL использовать PBKDF2 вместо EVP_BytesToKey, разработчикам рекомендуется самостоятельно получать ключ и IV с помощью 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 для расшифровки?