如何导出aes-128-cbc解密的密钥和初始化向量

Mat*_*tze -1 encryption openssl cryptography aes

openssl-1.0.2l.tar.gzhttps://www.openssl.org/source/下载了源包,并为 Windows 制作了一个全新的 x64 版本。我使用该openssl应用程序使用以下命令加密文件:

openssl enc -aes-128-cbc -a -salt -in data.txt -kfile key.txt -out encrypted.txt -p
Run Code Online (Sandbox Code Playgroud)

现在,我想在 .NET 应用程序(用 C# 编写)中使用加密文件。我读取了加密文件(Base64由于-a开关而使用 编码),对其进行解码,并提取前 16 个字节以获取 OpenSSL 生成的盐......到目前为止,这工作正常;盐以 为前缀Salted__,接下来的 8 个字节是实际的盐值。

到目前为止,我学到的是 OpenSSL 读取给定密钥文件的第一行并使用该字符串作为密码。实际的密钥和初始化向量是从 passphase、salt 和一些散列派生出来的,这些都没有正式记录。

-p开关给我一个用于加密的密钥和初始化向量,但我想知道,我怎么可以从已知的密码和盐重现数据......一切我曾尝试给我钥匙和矢量数据与 openssl 应用程序给我的不同。

当然,我已经在 stackoverflow 和 crypto.stackexchange 上找到了类似的问题(和答案),但似乎没有一个解决方案有效,或者与aes-256-cbc……不确定,如果这有什么不同?

需要做什么才能正确导出密钥和初始化向量?

Art*_* B. 5

它记录在此处此处,但您必须知道要查找的内容。该函数称为 EVP_BytesToKey,并使用哈希函数将盐和密码扩展为密钥和 IV。

请注意,OpenSSL 在 1.1.0 版(来源)中从 MD5 切换到 SHA-256 。迭代次数1和输出大小取决于选择的密钥大小和块大小。

  • [文档](https://www.openssl.org/docs/manmaster/man1/enc.html) 说:*“Openssl 1.1.0 中的默认摘要已从 MD5 更改为 SHA256。”*。因此,您的版本默认仍应使用 MD5。 (2认同)