我正在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。
答案 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
格式是非常不常见的。您确定这就是您想要的吗?“