C 用于openssl AES解密的派生密钥和iv

C 用于openssl AES解密的派生密钥和iv,c,openssl,C,Openssl,我正在尝试使用C代码中的openssl函数执行AES解密操作,但失败了 使用openssl命令行工具,我可以成功地解密blob openssl enc -d -p -aes-256-cbc -md md5 -in encrypted_file -out clear_file -pass file:./key_file -v 上述命令工作正常 但是当我使用openssl C函数来做同样的事情时,它失败了。失败似乎与错误的键和来自passwd和salt的iv有关 unsigned char key

我正在尝试使用C代码中的openssl函数执行AES解密操作,但失败了

使用openssl命令行工具,我可以成功地解密blob

openssl enc -d -p -aes-256-cbc -md md5 -in encrypted_file -out clear_file -pass file:./key_file -v
上述命令工作正常

但是当我使用openssl C函数来做同样的事情时,它失败了。失败似乎与错误的键和来自passwd和salt的iv有关

unsigned char key[32];
unsigned char iv[16];
EVP_BytesToKey(EVP_aes_256_cbc(), EVP_md5(), salt, key_file_buf, key_size, 1, key, iv);
[密钥文件是从密钥文件读取的无符号字符缓冲区。]

salt和key文件的hextump与命令行中使用的内容相匹配。大小也是正确的。(在我的例子中是45字节。)

EVP_BytesToKey()使用返回错误的密钥和iv会出现什么问题

我尝试过用iter计数值进行实验,但似乎没有一个生成工作键和iv。我假设命令行默认的iter计数为1

同样得到确认的是,如果我使用命令行中显示的工作密钥和iv覆盖从EVP_BytesToKey()返回的内容和硬代码无符号字符数组,那么我的代码的其余部分将正常工作并正确解密

关于信息,以下是代码的其余部分(从不同来源复制,在web上的示例)

有人能帮忙吗?

终于明白了! 应该是

EVP_BytesToKey(EVP_aes_256_cbc(), EVP_md5(), salt, key_file_buf, (key_size-1), 1, key, iv);
正如openssl文档中所解释的

文件:路径名 路径名的第一行是密码。如果为-passin和-passout参数提供了相同的pathname参数,那么第一行将用于输入密码,下一行用于输出密码

我的passwd文件以换行0x0A结尾。所以我从EVP_BytesToKey()的buf中删除了它,它返回正确的key&iv,现在可以解密了

EVP_BytesToKey(EVP_aes_256_cbc(), EVP_md5(), salt, key_file_buf, (key_size-1), 1, key, iv);