Cómo usar las funciones SHA256 de OpenSSL

Estoy escribiendo un progtwig para familiarizarme con OpenSSL, libncurses y redes UDP. Decidí trabajar con SHA256 de OpenSSL para familiarizarme con los estándares de encriptación de la industria, pero tengo problemas para hacerlo funcionar. He aislado el error al enlazar OpenSSL con el progtwig comstackdo. Estoy trabajando en Ubuntu 12.10, 64 bit. Tengo el paquete libssl-dev instalado.

Tomemos, por ejemplo, el C ++ main.cpp:

#include  #include  #include  #include  using namespace std; #include  string sha256(const string str) { unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256_CTX sha256; SHA256_Init(&sha256); SHA256_Update(&sha256, str.c_str(), str.size()); SHA256_Final(hash, &sha256); stringstream ss; for(int i = 0; i < SHA256_DIGEST_LENGTH; i++) { ss << hex << setw(2) << setfill('0') << (int)hash[i]; } return ss.str(); } int main() { cout << sha256("test") << endl; cout << sha256("test2") << endl; return 0; } 

Estoy usando la función SHA256 () que se encuentra aquí como un contenedor para la funcionalidad SHA256 de OpenSSL.

Cuando bash comstackr con los siguientes argumentos de g ++, recibo el siguiente error:

 millinon@myhost:~/Programming/sha256$ g++ -lssl -lcrypto -o main main.cpp /tmp/ccYqwPUC.o: In function `sha256(std::string)': main.cpp:(.text+0x38): undefined reference to `SHA256_Init' main.cpp:(.text+0x71): undefined reference to `SHA256_Update' main.cpp:(.text+0x87): undefined reference to `SHA256_Final' collect2: error: ld returned 1 exit status 

Entonces, GCC reconoce claramente las funciones y tipos definidos de OpenSSL, pero ld no encuentra los símbolos de función a los que se hace referencia en sha.h.

¿Debo señalar manualmente un objeto o directorio específico?

¡Gracias!

Comete un error muy común entre los principiantes … Al crear las bibliotecas con las que se vincula en el lugar equivocado en la línea de comando.

Las dependencias se invierten en la línea de comandos, por lo que algo que depende de otra cosa debe colocarse antes de lo que depende en la línea de comandos.

En su ejemplo, tiene un archivo fuente main.cpp que depende de un conjunto de bibliotecas, luego el archivo fuente debe estar antes de las bibliotecas de las que depende:

 $ g++ -o main main.cpp -lssl -lcrypto 

Para estar seguro, siempre coloque las bibliotecas al final , después de cualquier fuente u objeto de los archivos enumerados en la línea de comandos.

Esto funciona bien en mi sistema, pero puede intentar:

 extern "C" { #include  } 

que le dice a g ++ que todas las cosas en openssl / sha.h se declaran como funciones “C”.

Por cierto, ¿qué edad tiene su OpenSSL?