Pregunta sobre openssl, cryptography, c, encryption, linux – No se puede enlazar el código de OpenSSL

5

Estoy tratando de construir un programa simple openssl. Aquí está el código completo:

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

Intento compilarlo usando este comando:

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

y me sale esto:

 /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

Estoy bajo Ubuntu 10.04. ¿Cómo puedo conseguir que esto funcione?

Lo siento, he encontrado un ejemplo en la web sobre la vinculación y noté que el nombre del archivo .c estaba después del comando gcc. Lo cambié así y funcionó bien. Gracias por su tiempo y perdón por esas preguntas tontas. AlexandruC
¿Existe una dependencia en el orden en que especifique las bibliotecas? Tal vez intente revertirlos o agregar otro -lssl después del -lcrypto sizzzzlerz
Es un libcrypto.a, no libcrypto.so. Así que son librerías estáticas. Acabo de seguir las instrucciones del sitio web de openssl y trato de hacer que funcionen ahora. AlexandruC
@lxClan: eliminé ese comentario porque olvidé que los nombres de la biblioteca deben estar al final de la línea. Lo siento si fue confuso. indiv

Tu respuesta

2   la respuesta
2

ndo Windows, Mingw y estoOpenSSL para Windows (en este momento: Win32 OpenSSL v1.0.2a). Necesitas un enlace alibeay32.a que se encuentra enC:\OpenSSL-Win32\lib\MinGW\ (Después de instalar OpenSSL).

En mi caso estoy usando CMake y elCLion IDE potente, así que tuve que cambiar el nombre de la biblioteca alibeay32.dll.a Porque CMake no estaba localizando la biblioteca. Este es mi 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)

Hice la prueba con este ejemplo (que está tomado deesta respuesta):

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

-L opción y-lcrypto Estamos buscando un archivo para enlazar dinámicamente. Para enlazar estáticamente a una biblioteca específica, simplemente especifique su.a archivo en la línea de comandos del compilador después de todos los archivos de origen.

P.ej.,

gcc -I/home/aleksei/openSSL0.9.8/include -o app tema1.c ./libcrypto.a
Gracias por su respuesta. AlexandruC

Preguntas relacionadas