c++ - OpenSSL AES 仅适用于某些机器,即使使用静态链接
问题描述
我在 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
我的文件上的 ldd*.so
确认它是静态链接的:
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
与其他几个相同。那它们有什么区别呢?
我的目标是替换 WinAPICryptAcquireContextW(&cryptProv_, NULL, MS_ENH_RSA_AES_PROV_W,PROV_RSA_AES, CRYPT_VERIFYCONTEXT)
EVP_aes_256_cbc_hmac_sha256()
返回 nullptr,EVP_aes_256_cbc()
返回正确的对象并在两台机器上工作。
解决方案
不要使用EVP_aes_256_cbc_hmac_sha256()
. 这是一种高度专业化的密码,不适合一般用途。它仅供 libssl 使用。它的文档在此页面上:
https://www.openssl.org/docs/man1.1.1/man3/EVP_aes_256_cbc_hmac_sha256.html
该页面上最相关的部分说明了密码:
在 CBC 模式下使用 SHA256(SHA-2,256 位)作为 HMAC 使用 AES 进行身份验证加密,密钥长度分别为 128 位和 256 位。身份验证标签的长度为 256 位。
警告:这不适用于 TLS 之外的用途,并且需要调用一些未记录的 ctrl 函数。这些密码不符合 EVP AEAD 接口。
换句话说,如果您不了解此密码的未记录方面的详细信息,请不要触摸它。这些未记录的方面之一是并非所有平台都支持它。在某些平台上EVP_aes_256_cbc_hmac_sha256()
只返回 NULL,例如:
这是它在某些机器上对您有效但在其他机器上无效的最可能原因。
推荐阅读
- flutter - 如何在 Flutter 中将 DropdownButton 与 TextField 对齐?
- python - 如何将所有 100,000 列的循环时间数据 (HH:MM:SS) 转换为秒?
- c++ - callgrind 没有可用于仅几个函数的源
- laravel - Laravel 作业未尝试
- python - Python 在 Windows CMD 中运行带参数的命令
- python - Tensorflow GradientTape“变量不存在渐变”间歇性
- apache-spark - spark中创建的分区本质上是可变的还是不可变的?
- c - 检查C中的多指针重定向验证
- centos - 重启状态为down的节点
- c - C中带有while循环的阶乘