【问题标题】:OpenSSL AES works only on certain machine, even with static linkingOpenSSL AES 仅适用于某些机器,即使使用静态链接
【发布时间】: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,这就是错误消息的内容。

标签: c++ c ssl openssl aes


【解决方案1】:

不要使用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,例如见:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多