我在一个文件中生成了一个随机 256 位对称密钥,用于使用 OpenSSL 命令行加密一些数据,稍后我需要使用 OpenSSL 库以编程方式解密该数据。我没有成功,我认为问题可能出在我正在使用(或没有使用)的初始化向量中。
我使用以下命令加密数据:
/usr/bin/openssl enc -aes-256-cbc -salt -in input_filename -out output_filename -pass file:keyfile
我使用以下调用来初始化数据的解密:
EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), nullptr, keyfile.data(), nullptr))
keyfile
is a vector<unsigned char>
保存密钥的 32 字节。我的问题是关于最后一个参数。它应该是密码算法的初始化向量。我在加密时没有指定 IV,因此必须使用一些默认值。
为该参数传递 nullptr 是否意味着“使用默认值”?默认为空,并且第一个密码块中没有添加任何内容吗?
我应该提到的是,我可以从命令行解密,而无需提供 IV。
使用 EVP_aes_256_cbc() [原文如此] 密码加密时的默认 IV 是多少...
为该参数传递 nullptr 是否意味着“使用默认值”?默认为空,并且第一个密码块中没有添加任何内容吗?
空无一人。你必须提供它。为了完整性,IV 应该是不可预测的。
不可预测与两者略有不同Unique and Random。例如,SSLv3 过去使用最后一个密文块作为下一个块的 IV。它是Unique,但两者都不是Random nor 不可预测,并且它使 SSLv3 容易受到选定的明文攻击。
其他库做了一些聪明的事情,例如提供空向量(一串 0)。攻击者为此感谢他们。另请参阅为什么使用具有 CBC 模式的非随机 IV 会存在漏洞? https://stackoverflow.com/q/3008139/608639在堆栈溢出和如果使用已知和/或固定的 IV,CBC 模式下的 AES 安全吗? https://crypto.stackexchange.com/q/5094/10496在 Crypto.SE 上。
/usr/bin/openssl enc -aes-256-cbc...
我应该提到的是,我可以从命令行解密,而无需提供 IV。
OpenSSL 使用内部混搭/密钥派生函数,该函数获取密码并派生密钥和 iv。它的名字叫EVP_BytesToKey https://www.openssl.org/docs/man1.0.1/crypto/EVP_BytesToKey.html,您可以在手册页中阅读相关内容。手册页还说:
如果总密钥和 IV 长度小于摘要长度并且使用 MD5,则派生算法与 PKCS#5 v1.5 兼容,否则使用非标准扩展来派生额外数据。
有很多例子EVP_BytesToKey
一旦你知道要寻找什么。Openssl 密码到密钥 https://stackoverflow.com/q/9488919/608639是 C 中的一个。如何使用 AES 解密使用 openssl 命令加密的 Java 文件 https://stackoverflow.com/q/11783062/608639在 Java 中的一个。
EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), nullptr, keyfile.data(), nullptr))
我在加密时没有指定 IV,因此必须使用一些默认值。
检查您的返回值。呼叫应该在路径中的某个地方失败。也许不在EVP_DecryptInit_ex
,但肯定之前EVP_DecryptFinal
.
如果没有失败,请提交错误报告。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)