Frage an c, encryption, cryptography, linux, openssl – OpenSSL-Code kann nicht verknüpft werden

5

Ich versuche, ein OpenSSL-einfaches Programm zu erstellen. Hier ist der vollständige Code:

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

Ich versuche es mit diesem Befehl zu kompilieren:

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

und ich bekomme das:

 /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

Ich bin unter Ubuntu 10.04. Wie kann ich das zum Laufen bringen?

Das solltest du auchnicht benutzenAES_encrypt und Freunde. Sie sollten verwendenEVP_* funktionen. SehenEVP Symmetric Encryption und Decryption im OpenSSL-Wiki. In der Tat sollten Sie wahrscheinlich authentifizierte Verschlüsselung verwenden, da diese bietetbeide Vertraulichkeit und Authentizität. SehenEVP-authentifizierte Ver- und Entschlüsselung im OpenSSL-Wiki. jww
Entschuldigung, ich habe im Web ein Beispiel zum Verknüpfen gefunden und festgestellt, dass der Name der .c-Datei nach dem Befehl gcc steht. Schaltete es so und hat gut funktioniert. Vielen Dank für Ihre Zeit und Entschuldigung für solche dummen Fragen. AlexandruC
@indiv danke, auf diese Weise kann ich die Bibliothek aus dem aktuellen Verzeichnis laden. AlexandruC
Der Fehler besagt, dass der Linker die Definition für diese Funktionen nicht finden kann. Obwohl Sie die Bibliotheken auflisten, geben Sie die aktuelle Bibliothek für die Bibliothekspfade an, was möglicherweise das Problem ist. Hast dulibssl.so undlibcrypto.so im aktuellen Verzeichnis? Attila

Deine Antwort

2   die antwort
5

Sie versuchen möglicherweise, eine statische Verknüpfung herzustellen, aber die-L Option und-lcrypto suchen nach einer Datei, mit der dynamisch verknüpft werden kann. Um eine statische Verknüpfung zu einer bestimmten Bibliothek herzustellen, geben Sie einfach Ihre an.a Datei in der Compiler-Befehlszeile nach all Ihren Quelldateien.

Z.B.,

gcc -I/home/aleksei/openSSL0.9.8/include -o app tema1.c ./libcrypto.a
Vielen Dank für Ihre Antwort. AlexandruC
2

Für diejenigen unter Ihnen, die das gleiche Problem haben, aber Windows, Mingw und dieses verwendenOpenSSL für Windows (derzeit: Win32 OpenSSL v1.0.2a). Sie müssen eine Verknüpfung zu erstellenlibeay32.a das befindet sich inC:\OpenSSL-Win32\lib\MinGW\ (nach der Installation von OpenSSL).

In meinem Fall verwende ich CMake und dasleistungsstarke CLion IDEAlso musste ich die Bibliothek in umbenennenlibeay32.dll.a weil CMake die Bibliothek nicht gefunden hat. Das ist meine 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)

Ich habe den Test mit diesem Beispiel gemacht (das ist entlehnt vondiese Antwort):

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

Verwandte Fragen