c - PEM_read_RSAPublicKey() 在主应用程序代码中崩溃,但在示例代码中工作正常。我该如何解决这个问题?

标签 c openssl libcrypto

我正在 Visual Studio 6 中为 Win32 Dynamic_link 库编写 C/C++ 代码。实际上,我正在使用 libcryptoMD.lib 使用 pem 文件和 ppk 文件实现 RSA 加密。我可以在示例代码中进行此加密,但 PEM_read_RSAPublicKey() 在实际应用程序代码中会崩溃。

我已经尝试将实际应用程序代码的所有项目设置设置为示例项目,因为实际应用程序代码的依赖库中可能存在一些冲突。但令我惊讶的是,示例项目运行成功,但实际应用却失败了。我还搜索了为什么这个函数可能在实际应用程序代码中崩溃,但找不到任何有用的答案。该函数需要公钥pem文件的文件指针和RSA指针,这绝对没问题。

RSA * create_RSA(RSA * keypair, int pem_type, char *file_name) {

    RSA   *rsa = NULL;
    FILE  *fp  = NULL;

    if(pem_type == PUBLIC_KEY_PEM) 
    {
        fp = fopen(file_name, "rb");

        PEM_read_RSAPublicKey(fp, &rsa, NULL, NULL);

        fclose(fp);

    }
    else if(pem_type == PRIVATE_KEY_PEM) 
    {
        fp = fopen(file_name, "rb");
        PEM_read_RSAPrivateKey(fp, &rsa, NULL, NULL);
        fclose(fp);
    }

    return rsa;
}

PEM_read_RSAPublicKey(fp, &rsa, NULL, NULL); 崩溃,显示

OPENSSL_Uplink(6F8D1880,08): no OPENSSL_Applink in actual application code.

最佳答案

不清楚您是否尝试在此处使用两级 DLL,即您是否有一个 EXE 调用一个 DLL,该 DLL 包含您的代码,而该代码又调用 OpenSSL DLL?如果是这样,那是行不通的; OpenSSL 用于“上行链路”以执行文件 I/O 的 kludge 只能处理(直接)调用 OpenSSL DLL 的 EXE。您的替代方案是: 静态链接 OpenSSL(到您的 DLL 中);或者使用 BIO 接口(interface),以便(完全)在 OpenSSL 级别处理文件 I/O,或者自己执行 I/O(此处为输入)并为 OpenSSL 使用内存 BIO;查看我对 this similar Q 的回答.

如果您从 EXE 调用 OpenSSL DLL,则按照 the man page 上的记录(简洁地)编译 applink.c 并将其链接到 EXE 中,它应该可以工作。 ,或者如果您愿意,也可以选择上面的替代方案。

此外:正如 Andrew 所评论的,您应该检查 fopen 或其他 I/O 以及 PEM_read 例程上的错误 - 它们可能会失败。此外,PEM 文件是文本,不需要 b 标志,即使在 Windows 上也是如此。使用较低级别的 RSAPublicKey 格式而不是 [RSA_]PUBKEY 格式,是非常不寻常的;你确定这就是你想要的吗?”

关于c - PEM_read_RSAPublicKey() 在主应用程序代码中崩溃,但在示例代码中工作正常。我该如何解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58203573/

相关文章:

c - 如何用 C 语言编写面向对象的代码?

c - 用于中断安全的 malloc 替代方案

c - 从套接字缓冲数据?

c - 尝试在 OS X 10.9 中编译 Haskell 程序时的警告

通过 RVM 和 Rbenv 安装 Ruby 2.0.0 时出现 OpenSSL 错误

具有 TLSv1.2 和前向保密性的 Python Paste SSL 服务器

ssl - openssl BIO_do_connect 为 ssl 返回 0

mongodb - 无法启动mongod : version 'libssl.so.10' not found

delphi - 如何验证服务器主机名