在C+中使用OpenSSL+;建设者

在C+中使用OpenSSL+;建设者,openssl,rsa,c++builder,c++builder-10-seattle,Openssl,Rsa,C++builder,C++builder 10 Seattle,我正在西雅图用C++Builder 10编译一个应用程序,并尝试将OpenSSL用于RSA工作 我遵循了本教程: 代码如下: #include <stdio.h> #include <openssl/rsa.h> #include <openssl/pem.h> bool generate_key() { int ret = 0; RSA *r = NULL; BIGNUM

我正在西雅图用C++Builder 10编译一个应用程序,并尝试将OpenSSL用于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;
}
它说:

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

  • 我尝试使用
    implib.exe
    libeay32.lib
    转换为
    .dll
    文件。我输入了以下命令:

    coff2omf libeay32.lib Blibeay32.lib
    
    implib libeay32.lib Blibeay32.dll
    
    它说:

    错误:无法打开文件

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


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

    您不能使用预编译的OpenSSL DLL中包含的
    .lib
    文件。那些
    .lib
    文件是为Visual Studio准备的

    在C++Builder中,需要使用C++Builder的
    implib
    mkexp
    命令行实用程序从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
    


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

    没有XE10。有10.0西雅图、10.1柏林等。感谢您的回复。我使用OpenSSL-Win64\bin\libeay32.dll将其转换为.lib。但我使用“implib libeay32.lib libeay32.dll”。没有错误消息,它还会创建一个1KB大小的libeay32.lib文件。还是错了。仅适用于32位DLL。对于64位DLL,您需要改用。谢谢!它成功地创建了一个新的libeay32.lib。但是,当我将它添加到我的项目并编译时,[ilink32 Error]错误:“C:\USERS\ERICWANG\DESKTOP\TESTOPENSSL2\LIB\LIBEAY32.LIB”包含无效的OMF记录,键入0x21(可能是COFF),它再次发生。我将再说一遍-对于32位DLL使用
    implib
    ,对于64位DLL使用
    mkexp
    。32位使用
    .lib
    ,64位使用
    .a
    ilink32
    是32位,
    ilink64
    是64位
    .lib
    是OMF,
    .a
    是ELF。C++Builder从未支持COFF(不过Delphi支持)
    ilink32
    不会拒绝由
    implib
    创建的
    .lib
    ilink64
    不会拒绝由
    mkexp
    创建的
    .a
    mkexp libeay32.a libeay32.dll
    mkexp ssleay32.a ssleay32.dll