0

我正在为 Visual Studio 6 中的 Win32 Dynamic_link 库编写 ac/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。

4

1 回答 1

0

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

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

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

于 2019-10-02T16:18:02.123 回答