OpenSSL utilisant L'API EVP vs. algorithm pour la cryptographie symétrique

Salut j'ai installé openssl sur ma machine linux et j'ai parcouru les fichiers d'en-tête et la documentation (Ce qui est très insuffisant :( ).

j'essaie de construire un projet(en 'c') qui utilise la cryptographie symétrique algos (je me concentre sur aes256cbc). Le problème est que je suis confus comme dans la façon d'utiliser les fonctions de bibliothèque dans mon code.

pour mon implémentation de aes256cbc je peux utiliser directement les fonctions définies dans le 'aes.h ' header file (qui m'est apparu à la en premier lieu).

mais sur googling je suis venu à travers quelques tutoriel pour cela qui utilisent ' evp.h' fonctions pour ce faire http://saju.net.in/code/misc/openssl_aes.c.txt

y a-t-il une raison particulière à cela ou à l'accès direct à la Sea?h Fonctions est mieux.

Et aussi si quelqu'un peut m'indiquer une bonne documentation/tutoriel de toute nature sur l'utilisation de la librairie de cryptographie openssl sera apprécié.

de nombreuses merci

P. S Pardonne - moi si je suis naïve!--1-->

17
demandé sur Daniel Roethlisberger 2012-04-28 23:45:22

2 réponses

L'utilisation de L'API EVP a l'avantage que vous pouvez utiliser la même API pour tous les chiffrements symétriques qu'OpenSSL supporte, d'une manière générique. Cela le rend beaucoup plus facile de remplacer l'algorithme utilisé, ou faire l'algorithme configurable par l'utilisateur à un stade ultérieur. La plupart du code que vous écrivez n'est pas spécifique à l'algorithme de cryptage que vous avez sélectionné.

voici un exemple simple de chiffrement avec AES-256 en mode 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;
}

pour simplifier, j'ai omis l'erreur manutention.

IMO l'un des documents les plus importants sur OpenSSL est Sécurité Réseau avec OpenSSL par Viega/Messier/Chandra. Il est de 2002 (0.9.7), donc ne couvre pas les changements à OpenSSL au cours des 10 dernières années, mais il est IMO encore un moyen moins douloureux d'apprendre OpenSSL qu'en utilisant seulement les pages de manuel.

27
répondu Daniel Roethlisberger 2012-04-28 23:24:03

OpenSSL wiki dispose actuellement d'une bonne documentation sur la façon d'utiliser la famille de fonctions EVP: http://wiki.openssl.org/index.php/EVP

l'autre avantage de L'utilisation de L'API D'algorithme EVP over est QU'EVP utilisera automatiquement l'accélération matérielle (comme le jeu d'instructions AES-NI) si disponible. Avec l'API d'algorithme, vous devez l'activer manuellement.

1
répondu Hubert Kario 2014-09-22 15:48:12