在C++ Builder中使用OpenSSL

kim*_*kim 3 openssl rsa c++builder c++builder-10-seattle

我正在C++ Builder 10 Seattle中编译应用程序,并尝试使用OpenSSL进行RSA工作.

我按照本教程:

如何使用OpenSSL在C/C++中生成RSA密钥

这是代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

当我将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
    
    Run Code Online (Sandbox Code Playgroud)

    它说:

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

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

    implib libeay32.lib Blibeay32.dll
    
    Run Code Online (Sandbox Code Playgroud)

    它说:

    错误:无法打开文件

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

Rem*_*eau 6

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

您不能使用.lib预编译的OpenSSL DLL附带的文件.这些.lib文件适用于Visual Studio.

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

它工作正常,我已经使用这种技术多年来发布新的OpenSSL版本.

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

implib libeay32.lib libeay32.dll
implib ssleay32.lib ssleay32.dll
Run Code Online (Sandbox Code Playgroud)

mkexp libeay32.a libeay32.dll
mkexp ssleay32.a ssleay32.dll
Run Code Online (Sandbox Code Playgroud)

这将创建.lib.a包含分别从libeay32.dll和导入函数的引用的文件ssleay32.dll.