c++ - OpenSSL AES 仅适用于某些机器,即使使用静态链接也是如此

标签 c++ c ssl 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

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

我的目标是替换 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() 返回正确的对象并在两台机器上工作。

最佳答案

不要使用 EVP_aes_256_cbc_hmac_sha256()。这是一种高度特化的密码,不适合一般用途。它旨在仅由 libssl 使用。它的文档在此页面上:

https://www.openssl.org/docs/man1.1.1/man3/EVP_aes_256_cbc_hmac_sha256.html

该页面上最相关的部分是关于密码的:

Authenticated encryption with AES in CBC mode using SHA256 (SHA-2, 256-bits) as HMAC, with keys of 128 and 256 bits length respectively. The authentication tag is 256 bits long.

WARNING: this is not intended for usage outside of TLS and requires calling of some undocumented ctrl functions. These ciphers do not conform to the EVP AEAD interface.

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

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

这就是为什么它在某些机器上对您有效,但在其他机器上无效的最可能原因。

关于c++ - OpenSSL AES 仅适用于某些机器,即使使用静态链接也是如此,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57783497/

相关文章:

c++ - 快速图像 RGB 到 BGR 转换

git - 为什么 Heroku 中止 SSL 握手而不是 GitHub?

c++ - 无法在 python 中加载 C++ DLL

c++ - 迭代器生命周期

c++ - 为什么linux进程比windows轻量级?

c - 为什么这个字符串反转 C 代码会导致段错误?

c - 设置 tcp header 中的最大段大小

JavaScript/Greasemonkey : Avoiding FireFox Security Warning when Submitting a Form from a Secure Page

java - 通过 ssl 将 cassandra 与 datastax cassandra JAVA 驱动程序连接

python - C++ 中的 Crypto++ :Encrypt in Python , 解密