Вопрос по c, cryptography, linux, encryption, openssl – Не могу связать код OpenSSL

5

Я пытаюсь создать openssl простую программу. Вот полный код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "openssl/aes.h"

int main(int argc, char* argv[])
{
    AES_KEY aesKey_;
    unsigned char userKey_[16];
    unsigned char in_[16];
    unsigned char out_[16];
    strcpy(userKey_,"0123456789123456");
    strcpy(in_,"0123456789123456");

    fprintf(stdout,"Original message: %s", in_);
    AES_set_encrypt_key(userKey_, 128, &aesKey_);
    AES_encrypt(in_, out_, &aesKey_);

    AES_set_decrypt_key(userKey_, 128, &aesKey_);
    AES_decrypt(out_, in_,&aesKey_);
    fprintf(stdout,"Recovered Original message: %s", in_);      
    return 0;
}

Я пытаюсь скомпилировать его с помощью этой команды:

gcc -I/home/aleksei/openSSL0.9.8/include -o app -L . -lssl -lcrypto tema1.c

и я получаю это:

 /tmp/ccT1XMid.o: In function `main':
 tema1.c:(.text+0x8d): undefined reference to `AES_set_encrypt_key'
 tema1.c:(.text+0xa7): undefined reference to `AES_encrypt'
 tema1.c:(.text+0xbf): undefined reference to `AES_set_decrypt_key'
 tema1.c:(.text+0xd9): undefined reference to `AES_decrypt'
 collect2: ld returned 1 exit status

Я под Ubuntu 10.04. Как я могу заставить это работать?

Если я напишу местоположение, которое не существует для поиска библиотек, это даст мне следующее: / usr / bin / ld: not find -lssl. Значит, компоновщик их находит, но что? AlexandruC
Ошибка говорит вам, что компоновщик не может найти определение для этих функций. Даже если вы перечисляете библиотеки, вы указываете текущую библиотеку для путей к библиотекам, что может быть проблемой. У тебя естьlibssl.so а такжеlibcrypto.so в текущем каталоге? Attila
Даже с этой командой gcc -I / home / aleksei / openSSL0.9.8 / include -o app -L /home/aleksei/openSSL0.9.8/lib/ -lssl -lcrypto tema1.c это все равно дает мне тот же результат. Как я могу заставить компоновщик найти определения для этих функций? AlexandruC
Да, они есть в текущем каталоге. AlexandruC
Сбросьте символы в библиотеке.nm libcrypto.so | grep AES_, Появляются ли какие-нибудь из пропущенных символов? Если нет (или их письмоU вместоT), то символы действительно не находятся в библиотеке libcrypto. Они находятся в моей копии 0.9.8r, которую я скомпилировал с конфигурацией по умолчанию, но я предполагаю, что это OpenSSL, который вы создали сами, да? indiv

Ваш Ответ

2   ответа
5

-L вариант и-lcrypto ищите файл для динамической связи. Для статической ссылки на конкретную библиотеку, просто укажите свой.a файл в командной строке компилятора после всех ваших исходных файлов.

Например.,

gcc -I/home/aleksei/openSSL0.9.8/include -o app tema1.c ./libcrypto.a
Спасибо за ваш ответ. AlexandruC
2

кто имеет такую же проблему, но использует Windows, Mingw и этоOpenSSL для Windows (в настоящее время: Win32 OpenSSL v1.0.2a), Вам нужно сделать ссылку наlibeay32.a который расположен вC:\OpenSSL-Win32\lib\MinGW\ (после установки OpenSSL).

В моем случае я использую CMake имощный CLion IDEпоэтому мне пришлось переименовать библиотеку вlibeay32.dll.a потому что CMake не находил библиотеку. Это мой CMakeLists.txt:

cmake_minimum_required(VERSION 3.1)
project(openssl_1_0_2a)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

include_directories(C:\\OpenSSL-Win32\\include)

set(SOURCE_FILES main.cpp)

link_directories(C:\\OpenSSL-Win32\\lib\\MinGW)

add_executable(openssl_1_0_2a ${SOURCE_FILES})

target_link_libraries(openssl_1_0_2a eay32)

Я сделал тест с этим примером (который заимствован изэтот ответ):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "openssl/aes.h"

int main(int argc, char* argv[])
{
    AES_KEY aesKey_;
    unsigned char userKey_[16];
    unsigned char in_[16] = {0};
    unsigned char out_[16] = {0};
    strcpy((char *) userKey_,"0123456789123456");
    strcpy((char *) in_,"0123456789123456");

    fprintf(stdout,"Original message: %s\n", in_);
    AES_set_encrypt_key(userKey_, 128, &aesKey_);
    AES_encrypt(in_, out_, &aesKey_);

    AES_set_decrypt_key(userKey_, 128, &aesKey_);
    AES_decrypt(out_, in_,&aesKey_);
    fprintf(stdout,"Recovered Original message: %s XXX \n", in_);
    return 0;
}

Похожие вопросы