我正在 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/