Impossible de lier le code OpenSSL

J’essaie de construire un programme simple openssl. Voici le code complet:

#include  #include  #include  #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; } 

J’essaie de le comstackr en utilisant cette commande:

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

et je reçois ceci:

  /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 

Je suis sous Ubuntu 10.04. Comment puis-je faire fonctionner ceci?

Vous tentez peut-être de lier de manière statique, mais l’option -L et -lcrypto recherchent un fichier avec -lcrypto un lien dynamic. Pour établir un lien statique avec une bibliothèque spécifique, spécifiez simplement votre fichier .a sur la ligne de commande du compilateur après tous vos fichiers source.

Par exemple,

 gcc -I/home/aleksei/openSSL0.9.8/include -o app tema1.c ./libcrypto.a 

Pour ceux d’entre vous qui ont le même problème mais qui utilisent Windows, Mingw et cet OpenSSL pour Windows (actuellement: Win32 OpenSSL v1.0.2a) . Vous devez libeay32.a lien vers libeay32.a situé dans C:\OpenSSL-Win32\lib\MinGW\ (après avoir installé OpenSSL).

Dans mon cas, j’utilise CMake et l’ IDE puissant de CLion , j’ai donc dû renommer la bibliothèque en libeay32.dll.a car CMake ne localisait pas la bibliothèque. Ceci est mon 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) 

J’ai fait le test avec cet exemple (qui est emprunté à cette réponse ):

 #include  #include  #include  #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; }