PEM_read_RSAPublicKey()在主应用程序代码中崩溃,但在示例代码中运行良好。我该如何解决这个问题?

时间:2019-10-02 14:26:29

标签: 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):实际应用程序代码中没有OPENSSL_Applink。

1 个答案:

答案 0 :(得分:0)

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

如果您是从EXE调用到OpenSSL DLL,则按照the man page上的文档(分别)进行编译并将applink.c链接到EXE应该可以正常工作,或者您可以选择上面的替代方法如果您愿意。

此外:正如安德鲁所说,您应该检查fopen或其他I / O以及PEM_read例程中的错误-它们可能会失败。而且,PEM文件是文本,甚至在Windows上也不需要b标志。并且使用较低级别的RSAPublicKey格式而不是[RSA_]PUBKEY格式是非常不常见的。您确定这就是您想要的吗?“