Pergunta sobre openssl, cryptography, encryption, c, linux – Não é possível vincular o código OpenSSL

5

Eu estou tentando construir um programa simples openssl. Aqui está o 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;
}

Eu tento compilá-lo usando este comando:

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

e eu entendo isso:

 /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

Estou no Ubuntu 10.04. Como posso fazer isso funcionar?

@indiv diz T antes deles, eles estão todos lá. AlexandruC
@indiv obrigado, é assim que consigo fazer com que a biblioteca carregue a partir do diretório atual. AlexandruC
É um libcrypto.a, não libcrypto.so. Então eles são bibliotecas estáticas. Acabei de seguir as instruções do site openssl e estou tentando fazê-las funcionar agora. AlexandruC
Existe uma dependência na ordem em que você especifica as bibliotecas? Talvez tente invertê-los ou adicionar outro -lssl após o -lcrypto sizzzzlerz

Sua resposta

2   a resposta
2

Para aqueles de vocês que têm esse mesmo problema, mas estão usando o Windows, Mingw e esteOpenSSL for Windows (no momento: Win32 OpenSSL v1.0.2a). Você precisa vincularlibeay32.a que está localizado emC:\OpenSSL-Win32\lib\MinGW\ (depois de instalar o OpenSSL).

No meu caso estou usando o CMake e opoderoso IDE do CLion, então eu tive que renomear a biblioteca paralibeay32.dll.a porque o CMake não estava localizando a biblioteca. Este é o meu 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)

Eu fiz o teste com este exemplo (que é emprestado deesta resposta):

#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

Você pode estar tentando vincular estaticamente, mas o-L opção e-lcrypto estão procurando por um arquivo para vincular dinamicamente. Para vincular estaticamente a uma biblioteca específica, basta especificar.a arquivo na linha de comando do compilador após todos os seus arquivos de origem.

Por exemplo.,

gcc -I/home/aleksei/openSSL0.9.8/include -o app tema1.c ./libcrypto.a
Obrigado pela sua resposta. AlexandruC

Perguntas relacionadas