2016-07-26 13 views
3

Я компилирую приложение в C++ Builder 10 Seattle и пытаюсь использовать OpenSSL для работы RSA.Использование OpenSSL в C++ Builder

Я после этого учебника:

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.lib и ssleay32.lib к моему проекту, я получил сообщение об ошибке:

[ilink32 Error] Error: 'C:\USERS\ERICWANG\DESKTOP\TESTOPENSSL2\LIB\LIBEAY32.LIB' contains invalid OMF record, type 0x21 (possibly COFF)

Я видел несколько советов например, coff2omf и implib Инструменты, но оба не работают.

  1. Я использовал coff2omf.exe для преобразования libeay32.lib. Я поставил coff2omf.exe и libeay32.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 изменить его размер для 1КБ файла. Это означает, что файл был неправильным.

+1

Нет ** XE10 **. Существует ** 10.0 Сиэтл **, ** 10.1 Берлин ** и т. Д. –

ответ

5

OpenSSL отлично работает в C++ Builder. Я использую его в своих собственных приложениях C++ Builder.

Вы не можете использовать файлы .lib, которые входят в состав предварительно скомпилированных библиотек OpenSSL. Те файлы .lib предназначены для Visual Studio.

В C++ Builder вам необходимо использовать утилиту командной строки C++ Builder implib или mkexp для создания совместимых с C++ Builder библиотек импорта из DLL. Используйте implib для 32-разрядных DLL и mkexp для 64-разрядных библиотек DLL.

Он отлично работает, я использую этот метод в течение многих лет, когда выпущены новые версии 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 

Это создаст .lib или .a файлы, содержащие ссылки на импорт функций из libeay32.dll и ssleay32.dll соответственно.

+0

Спасибо за ваш ответ. – kim

+0

Я беру OpenSSL-Win64 \ bin \ libeay32.dll, чтобы преобразовать его в .lib. Но я использую «implib libeay32.lib libeay32.dll». Нет сообщения об ошибке, также создается файл libeay32.lib размером 1 КБ. Все еще неправильно. – 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). –

Смежные вопросы