2012-04-28 17 views
16

Hola he instalado OpenSSL en mi máquina Linux y pasando por los archivos de cabecera y la documentación (que es altamente insufficint :().OpenSSL utilizando EVP vs API algoritmo de criptografía simétrica

Estoy tratando de construir un proyecto (en 'c'), que utiliza algos criptográficos simétricos (i estoy centrando en aes256cbc). El problema es que estoy confundido en cuanto a cómo utilizar las funciones de biblioteca en mi código.

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

Pero 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 apreciada.

muchas gracias

PS perdóname si estoy siendo ingenuo

Respuesta

27

Uso de la API EVP tiene la ventaja de que se puede utilizar la misma API para todos los sistemas de cifrado simétrico que OpenSSL soporta, 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í está un ejemplo sencillo para el cifrado con AES-256 en el 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, que omite el tratamiento de errores.

IMO uno de los documentos más importantes en OpenSSL es Network Security with OpenSSL by 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.

+0

muchas gracias por la nítida explicación y la recomendación del libro. Estaba harto después de buscar un buen recurso en la red para la explicación de la api crypto. Una pregunta más donde puedo encontrar la biblioteca crypto donde puedo ver la implementación real de todos los archivos evp.h y otros * .h. Intenté leer varias bibliotecas que se instalan con openssl en la carpeta lib, pero supongo que son código objeto. Cualquier sugerencia en esta dirección. Muchas gracias. – abhi

+1

Puede obtener la fuente tarball de http://www.openssl.org/source/ que coincida con su versión instalada de OpenSSL. –

+1

Muchas gracias por recomendar el mencionado libro. Me ayudó un poco, el capítulo 6 despejó muchas de las dudas que tenía con respecto a la API de EVP. Gracias una vez más. – abhi

1

Actualmente OpenSSL wiki tiene una buena documentación sobre el uso de la familia EVP de funciones: http://wiki.openssl.org/index.php/EVP

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

Cuestiones relacionadas