【问题标题】:OpenSSL RSA library throws exceptionOpenSSL RSA 库抛出异常
【发布时间】:2018-02-20 20:30:31
【问题描述】:

我想在我的DLL 项目中使用Visual Studio 2017 编写的DLL 项目包括RSA 加密,我认为OpenSSL 是完美的。我在Additional Include DirectoriesAdditional Library Directiories 中添加了我的OpenSSL 文件夹的正确路径,我已将libcrypto.lib/libeay32.lib 添加到Additional Dependencies。该项目可以编译,但是当我想使用 rsa.h 中的一些函数(如 RSA_size)时,我收到如下异常:

Exception thrown at 0x0F17EB64 (libcrypto-1_1.dll) in Win32Project1.exe: 0xC0000005: Access violation reading location 0x00000004.

我假设这是因为库中的某个指针变为 NULL,但我找不到原因。 This 告诉我用常规的 exe 应用程序试试这个库,但即使使用最简单的代码也会出现同样的错误

#include <openssl/rsa.h>
int main()
{
    RSA *m_rsa = RSA_new();
    RSA_size(m_rsa);
    return 0;
}

我尝试在1.1.01.0.2 版本中实现OpenSSL,结果相同。

RSA_new 正确分配了新的 RSA 实例,ERR_get_error() 返回“0”。

【问题讨论】:

    标签: c++ dll openssl


    【解决方案1】:

    查看库文档:

    如果分配失败,RSA_new() 返回 NULL 并设置错误代码 可以通过 ERR_get_error(3) 获得。否则它返回一个 指向新分配的结构的指针。

    RSA_new 可能会失败并返回空指针。 使用RSA_size() 将使用这个空指针(地址0)来访问RSA 结构的一个字段。如果此字段在偏移量 4 处,您将尝试访问地址 4(基地址 0 + 偏移量 4),您将得到“访问冲突读取位置 0x00000004”。

    所以,检查返回的指针。如果为null,请检查错误代码以查看发生了什么...

    图书馆链接:

    编辑:

    另外需要知道的是,在调用RSA_size() (see documentation) 时RSA-&gt;n 不应为空。 n 用于模数,因此在生成或设置密钥之前不能调用RSA_size()

    查看此示例 (permalink here):

    #include <openssl/rsa.h>
    int main ()
    {
        RSA* rsa = RSA_new ();
        std::cout << "rsa pointer = " << rsa << std::endl;
        std::cout << "rsa->n = " << rsa->n << std::endl;
        RSA_size ( rsa ); // Seg fault.
    
        return EXIT_SUCCESS;
    }
    

    输出:

    rsa pointer = 0x12d9c20
    rsa->n = 0
    bash: line 7: 10149 Segmentation fault      (core dumped) ./a.out
    

    【讨论】:

    • 对不起,我忘了说RSA_new返回的RSA指针实际上是有效的(至少不是nullptr,ERR_get_error()返回“0”)
    • 好的,不熟悉这个库,但似乎您应该生成或设置一个允许调用 RSA_size() 的密钥。答案已完成,包含更多详细信息。
    • 当我尝试从 rsa 对象(如 rsa->n)中获取任何东西时,我收到pointer to incomplete class type is not allowed。也许这是一个线索?
    • 经过调查,我发现 RSA_new() 创建了新的 RSA 指针,其中 'n' 确实设置为 0。有没有办法生成实际的“有效”密钥来对其执行操作?这里不应该需要 RSA_generate_key_ex
    猜你喜欢
    • 2010-12-10
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    相关资源
    最近更新 更多