【发布时间】:2019-09-04 07:30:15
【问题描述】:
我在 Linux 上使用 OpenSSL 1.1.1 进行 AES 解密。它适用于我的机器,但不适用于另一台机器,所以我使用了静态链接。它没有帮助。这是一个代码:
if (EVP_DecryptInit(ctx.get(), EVP_aes_256_cbc_hmac_sha256(), _key.impl.data(),
nullptr) != 1)
{
const char* errorString = ERR_error_string(ERR_get_error(), nullptr);
return out;
}
在它不起作用的机器上,errorString 如下:
error:0607B083:digital envelope routines:EVP_CipherInit_ex:no cipher set
我的*.so 文件上的ldd 确认它是静态链接的:
ldd mylib.so
linux-vdso.so.1 (0x00007ffe971a9000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa3a3b64000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fa3a395c000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa3a373d000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fa3a33b4000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa3a3016000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa3a2dfe000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa3a2a0d000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa3a445b000)
我做错了什么?
编辑:
我刚刚发现EVP_aes_256_cbc 返回的结果与EVP_aes_256_cbc_hmac_sha256 和其他几个相同。那它们有什么区别呢?
我的目标是替换 WinAPI CryptAcquireContextW(&cryptProv_, NULL, MS_ENH_RSA_AES_PROV_W,PROV_RSA_AES, CRYPT_VERIFYCONTEXT)
EVP_aes_256_cbc_hmac_sha256() 返回 nullptr,EVP_aes_256_cbc() 返回正确的对象并在两台机器上工作。
【问题讨论】:
-
如果这是一个链接问题,你的程序甚至不会运行。您如何在第一台计算机上设置密码?你能比较两台电脑的
openssl.cnf吗? -
@Mathieu 我的意思是共享对象在每台计算机中可能不同。使用静态链接不应该存在这个问题。
-
这是一个完美的例子,说明为什么将四个函数调用塞进一行,例如
if (EVP_DecryptInit(ctx.get(), EVP_aes_256_cbc_hmac_sha256(), _key.impl.data(), nullptr) != 1)是一个非常糟糕的主意。在这四个函数调用中,您根本无法分辨哪一个出错了。你怎么知道不是@987654332@ 甚至_key.impl.data()在某些系统上出现故障并导致级联故障?你不能说出来。但是,如果您分别进行每个调用,检查 每个 调用是否成功并记录失败,您就会知道。 10 LOC 用于无法解决的问题?不好。 -
您是否遇到与“EVP_aes_256_cbc()”完全相同的错误?即“无密码集”错误?从 EVP_DecryptInit 返回的 唯一 原因是您的输入密码是否为 NULL,即“EVP_aes_256_cbc()”返回 NULL(您可以添加一些调试以确认是否是这种情况)。如果发生这种情况,那么某处出现了严重错误......
-
@AndrewHenle
EVP_aes_256_cbc_hmac_sha256()返回 nullptr,这就是错误消息的内容。