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;
}

在它不起作用的计算机上,错误字符串如下:

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和其他几个人相同。那它们之间有什么区别呢?

我的目标是替换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 模式下使用 AES 进行身份验证的加密,使用 SHA256(SHA-2,256 位(作为 HMAC,密钥长度分别为 128 位和 256 位。身份验证标记的长度为 256 位。

警告:这不适用于 TLS 之外的使用,需要调用一些未记录的 ctrl 函数。这些密码不符合 EVP AEAD 接口。

换句话说,如果您不了解此密码的未记录方面的详细信息,请不要触摸它。其中一个未记录的方面是并非所有平台都支持它。在某些平台上,EVP_aes_256_cbc_hmac_sha256()只返回 NULL,例如:

https://github.com/openssl/openssl/blob/1bf29d497e66efef0fbc9b1864d8a5db64bf898e/crypto/evp/e_aes_cbc_hmac_sha256.c#L934-L950

这是它在某些机器上对您有效,但在其他机器上不起作用的最可能原因。

最新更新