encrypt enc c linux cryptography openssl

enc - openssl linux



OpenSSL usando EVP vs. algoritmo API para cripto simétrico (2)

Hola, he instalado openssl en mi máquina Linux y reviso los archivos de cabecera y la documentación (que es muy insuficiente :().

Estoy intentando construir un proyecto (en ''c'') que usa cripto algos simétricos (me estoy enfocando en aes256cbc). El problema es que estoy confundido en cuanto a cómo usar las funciones de la biblioteca en mi código.

Para mi implementación de aes256cbc, puedo usar directamente las funciones definidas en el archivo de encabezado ''aes.h'' (que me pareció en primer lugar).

Pero al buscar en Google encontré un tutorial para esto que está usando las funciones ''evp.h'' para hacer esto http://saju.net.in/code/misc/openssl_aes.c.txt

¿Hay alguna razón específica para esto o para acceder directamente a las funciones aes.h es mejor?

Y también si alguien puede indicarme una buena documentación / tutorial de cualquier tipo sobre el uso de la biblioteca de cifrado de openssl será muy apreciado.

muchas gracias

PD, perdóname si estoy siendo ingenuo


El uso de la API EVP tiene la ventaja de que puede usar la misma API para todas las cifras simétricas compatibles con OpenSSL, de forma genérica. Esto hace que sea mucho más fácil reemplazar el algoritmo utilizado, o hacer que el algoritmo sea configurable por el usuario en una etapa posterior. La mayor parte del código que escribe no es específico del algoritmo de encriptación que seleccionó.

Aquí hay un ejemplo simple para el cifrado con AES-256 en modo CBC:

#include <stdio.h> #include <openssl/evp.h> int main() { EVP_CIPHER_CTX ctx; unsigned char key[32] = {0}; unsigned char iv[16] = {0}; unsigned char in[16] = {0}; unsigned char out[32]; /* at least one block longer than in[] */ int outlen1, outlen2; EVP_EncryptInit(&ctx, EVP_aes_256_cbc(), key, iv); EVP_EncryptUpdate(&ctx, out, &outlen1, in, sizeof(in)); EVP_EncryptFinal(&ctx, out + outlen1, &outlen2); printf("ciphertext length: %d/n", outlen1 + outlen2); return 0; }

Para simplificar, omití el manejo de errores.

IMO una de las piezas más importantes de documentación sobre OpenSSL es Network Security with OpenSSL de Viega / Messier / Chandra . Es de 2002 (0.9.7), por lo que no cubre los cambios en OpenSSL durante los últimos 10 años, pero sigue siendo una forma menos dolorosa de aprender OpenSSL que utilizando solo las páginas de manual.


Actualmente, la wiki de OpenSSL contiene una buena documentación sobre cómo usar la familia de funciones EVP: http://wiki.openssl.org/index.php/EVP

La otra ventaja de utilizar el EVP sobre el algoritmo API es que EVP utilizará automáticamente la aceleración de hardware (como el conjunto de instrucciones AES-NI) si está disponible. Con la API de algoritmo, debes habilitarla manualmente.