当使用已弃用的 `crypto.createCipher` 函数时,Node.JS 加密模块如何生成密钥和初始化向量?

How does the Node.JS crypto module produce a key and an initialization vector when the deprecated `crypto.createCipher` function is used?

我继承了一个数据库,其中一些字段被遗留代码加密。

该代码使用了 Node.js 提供的(现已弃用)crypto.createCipher 函数。此函数需要传递明文密码,而不是密钥和初始化向量。文档表明密钥和 IV 是(以某种方式)从提供的密码派生的。

我有使用过的密码,但想在另一个应用程序中解密数据,该应用程序使用标准 key/IV 组合初始化 AES 密码的语言编写(Python 3 ).

查看 Node.js 代码库,在 cipher.js 中,我完全不清楚这是如何完成的。

我在写完这篇文章后看到,这个问题有一个 ruby 特定的答案 here,我在搜索时找不到。我决定在这里创建一个更通用的问答以提高其可见性。

节点使用 md5 hash function 计算键和值。

一个 32 字节的密钥使用以下算法生成(以伪代码显示):

Let A = md5(password)
Let B = md5(concatenate(A, password))
Let Key = concatenate(A,B)

然后生成一个 16 字节的初始化向量:

Let IV = md5(concatenate(key, password))