EVP_DecryptInit_ex
是 AES 解密原语的接口。这只是解密 OpenSSL 加密格式所需的一部分。OpenSSL 加密格式没有很好的文档记录,但是您可以从代码和一些文档中反向使用它。EVP_BytesToKey
文档中解释了密钥和 IV 计算:
The key and IV is derived by concatenating D_1, D_2, etc until enough
data is available for the key and IV. D_i is defined as:
D_i = HASH^count(D_(i-1) || data || salt)
where || denotes concatentaion, D_0 is empty, HASH is the digest
algorithm in use, HASH^1(data) is simply HASH(data), HASH^2(data) is
HASH(HASH(data)) and so on.
The initial bytes are used for the key and the subsequent bytes for the
IV.
这里的“HASH”是MD5。实际上,这意味着您可以像这样计算哈希:
Hash0 = ''
Hash1 = MD5(Hash0 + Password + Salt)
Hash2 = MD5(Hash1 + Password + Salt)
Hash3 = MD5(Hash2 + Password + Salt)
...
然后提取密钥所需的字节,然后提取 IV 所需的字节。对于 AES-128,这意味着 Hash1 是密钥,Hash2 是 IV。对于 AES-256,密钥是 Hash1+Hash2(连接,未添加),Hash3 是 IV。
您需要剥离前导Salted___
标头,然后使用盐来计算密钥和 IV。然后你将有碎片喂入EVP_DecryptInit_ex
。
但是,由于您是在 C++ 中执行此操作,因此您可能只需挖掘enc
代码并重用它(在验证其许可证与您的使用兼容之后)。
请注意,OpenSSL IV 是随机生成的,因为它是涉及随机盐的散列过程的输出。第一个区块的安全性不依赖于 IV 本身是随机的;它只要求永远不要重复特定的 IV+Key 对。OpenSSL 过程确保只要随机盐永远不会重复。
以这种方式使用 MD5 可能会以泄露信息的方式将密钥和 IV 纠缠在一起,但我从未见过这样的分析。如果你必须使用 OpenSSL 格式,我不会对它的 IV 代有任何犹豫。OpenSSL 格式的大问题是它的暴力破解速度很快(4 轮 MD5 拉伸不够)并且它缺乏任何身份验证。