【问题标题】:Use OpenSSL in C++Builder在 C++Builder 中使用 OpenSSL
【发布时间】:2016-11-29 15:45:11
【问题描述】:

我正在西雅图 C++Builder 10 中编译一个应用程序,并尝试使用 OpenSSL 进行 RSA 工作。

我遵循了这个教程:

How to Use OpenSSL to Generate RSA Keys in C/C++

代码如下:

#include <stdio.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>

bool generate_key()
{
    int             ret = 0;
    RSA             *r = NULL;
    BIGNUM          *bne = NULL;
    BIO             *bp_public = NULL, *bp_private = NULL;

    int             bits = 2048;
    unsigned long   e = RSA_F4;

    // 1. generate rsa key
    bne = BN_new();
    ret = BN_set_word(bne,e);
    if(ret != 1){
        goto free_all;
    }

    r = RSA_new();
    ret = RSA_generate_key_ex(r, bits, bne, NULL);
    if(ret != 1){
        goto free_all;
    }

    // 2. save public key
    bp_public = BIO_new_file("public.pem", "w+");
    ret = PEM_write_bio_RSAPublicKey(bp_public, r);
    if(ret != 1){
        goto free_all;
    }

    // 3. save private key
    bp_private = BIO_new_file("private.pem", "w+");
    ret = PEM_write_bio_RSAPrivateKey(bp_private, r, NULL, NULL, 0, NULL, NULL);

    // 4. free
    free_all:

    BIO_free_all(bp_public);
    BIO_free_all(bp_private);
    RSA_free(r);
    BN_free(bne);

    return (ret == 1);
}

int main(int argc, char* argv[]) 
{
    generate_key();
    return 0;
}

当我将libeay32.libssleay32.lib 添加到我的项目时,我收到一条错误消息:

[ilink32 错误] 错误:'C:\USERS\ERICWANG\DESKTOP\TESTOPENSSL2\LIB\LIBEAY32.LIB' 包含无效的 OMF 记录,类型 0x21(可能是 COFF)

我看过一些技巧,比如使用 coff2omfimplib 工具,但都不起作用。

  1. 我使用coff2omf.exe 转换libeay32.lib。我把coff2omf.exelibeay32.lib放在同一个文件夹里,输入这个命令:

    coff2omf libeay32.lib Blibeay32.lib
    

    它说:

    错误:COFF 错误:libeay32.lib:检测到无效的机器类型

  2. 我尝试使用implib.exelibeay32.lib 转换为.dll 文件。我输入了这个命令:

    implib libeay32.lib Blibeay32.dll
    

    它说:

    错误:无法打开文件

    我的libeay32.lib 将其大小更改为 1KB 文件。这意味着文件错误。

【问题讨论】:

  • 没有XE10。有10.0西雅图10.1柏林

标签: openssl rsa c++builder c++builder-10-seattle


【解决方案1】:

OpenSSL 在 C++Builder 中运行良好。我在自己的 C++Builder 应用程序中使用它。

您不能使用预编译的 OpenSSL DLL 中包含的 .lib 文件。这些.lib 文件适用于Visual Studio。

在 C++Builder 中,您需要使用 C++Builder 的 implibmkexp 命令行实用程序从 DLL 创建与 C++Builder 兼容的导入库。对 32 位 DLL 使用 implib,对 64 位 DLL 使用 mkexp

它工作得很好,当新的 OpenSSL 版本发布时,我一直在使用这种技术。

您的implib 命令错误。您不能“libeay32.lib 转换为.dll 文件”。第一个参数是输出参数,第二个参数是输入参数。您需要为现有 DLL创建.lib 文件。没有Blibeay32.dll 文件,这就是您收到“无法打开文件”错误的原因。删除 B 并使用正确的 DLL 文件名:

implib libeay32.lib libeay32.dll
implib ssleay32.lib ssleay32.dll

mkexp libeay32.a libeay32.dll
mkexp ssleay32.a ssleay32.dll

这将创建 .lib.a 文件,其中包含分别用于从 libeay32.dllssleay32.dll 导入函数的引用。

【讨论】:

  • 感谢您的回复。
  • 我将 OpenSSL-Win64\bin\libeay32.dll 转换为 .lib 。但我使用“imlib libeay32.lib libeay32.dll”。没有错误信息,它还创建了一个 1KB 大小的 libeay32.lib 文件。还是错了。
  • implib.exe 仅适用于 32 位 DLL。对于 64 位 DLL,您需要改用 mkexp.exe
  • 谢谢!它成功创建了一个新的 libeay32.lib。但是当我将它添加到我的项目并编译时, [ilink32 Error] Error: 'C:\USERS\ERICWANG\DESKTOP\TESTOPENSSL2\LIB\LIBEAY32.LIB' contains invalid OMF record, type 0x21 (possibly COFF) ,它又发生了.
  • 我再说一遍 - 对 32 位 DLL 使用 implib,对 64 位 DLL 使用 mkexp。 32 位使用.lib,64 位使用.ailink32 是 32 位,ilink64 是 64 位。 .lib 是 OMF,.a 是 ELF。 C++Builder 从来不支持 COFF(尽管 Delphi 支持)。 ilink32 不会拒绝由implib 创建的.libilink64 不会拒绝由mkexp 创建的.a
猜你喜欢
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
相关资源
最近更新 更多