2016-07-26 329 views
3

我正在編譯C++ Builder 10 Seattle中的應用程序,並嘗試使用OpenSSL進行RSA工作。在C++ Builder中使用OpenSSL

我跟着這個教程:

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 Error] Error: 'C:\USERS\ERICWANG\DESKTOP\TESTOPENSSL2\LIB\LIBEAY32.LIB' contains invalid OMF record, type 0x21 (possibly COFF)

我見過一些提示就像使用coff2omfimplib工具,但兩者都不起作用。

  1. 我用coff2omf.exe轉換成libeay32.lib。我把coff2omf.exelibeay32.lib在同一文件夾,並輸入以下命令:

    coff2omf libeay32.lib Blibeay32.lib 
    

    它說:

    ERROR: COFF error: libeay32.lib : invalid machine type detected

  2. 我試圖libeay32.lib轉換爲.dll文件中使用implib.exe。我進入這個命令:

    implib libeay32.lib Blibeay32.dll 
    

    它說:

    Error : unable to open file

    而且我libeay32.lib改變其大小,以1KB的文件。這意味着該文件是錯誤的。

+1

沒有** XE10 **。有** 10.0西雅圖**,** 10.1柏林**等 –

回答

5

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文件」。第一個參數是輸出參數,第二個參數是輸入參數。您需要創建 a .lib文件爲現有 DLL。沒有Blibeay32.dll文件,這就是爲什麼你得到「無法打開文件」的錯誤。放下B並使用正確的DLL文件名:

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

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

這將創建一個包含從分別libeay32.dllssleay32.dll,導入函數的引用.lib.a文件。

+0

感謝您的回覆。 – kim

+0

我將OpenSSL-Win64 \ bin \ libeay32.dll轉換爲.lib。 但我使用「implib libeay32.lib libeay32.dll」。 沒有錯誤信息,它也創建一個1KB大小的libeay32.lib文件。 仍然錯誤。 – kim

+0

['implib.exe'](http://docwiki.embarcadero.com/RADStudio/en/IMPLIB.EXE,_the_Import_Library_Tool_for_Win32)僅適用於32位DLL。對於64位DLL,您需要使用['mkexp.exe'](http://docwiki.embarcadero.com/RADStudio/en/MKEXP.EXE,_the_64-bit_Windows_Import_Library_Tool_for_C%2B%2B)。 –