EVP_CIPHER_CTX_init(3) EVP_EncryptUpdate,

SYNOPSIS

#include <openssl/evp.h>

void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *a);

int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
         ENGINE *impl, unsigned char *key, unsigned char *iv);
 int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out,
         int *outl, unsigned char *in, int inl);
 int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out,
         int *outl);

int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
         ENGINE *impl, unsigned char *key, unsigned char *iv);
 int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out,
         int *outl, unsigned char *in, int inl);
 int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm,
         int *outl);

int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
         ENGINE *impl, unsigned char *key, unsigned char *iv, int enc);
 int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out,
         int *outl, unsigned char *in, int inl);
 int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm,
         int *outlB);>

int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
         unsigned char *key, unsigned char *iv);
 int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out,
         int *outl);

int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
         unsigned char *key, unsigned char *iv);
 int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm,
         int *outl);

int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
         unsigned char *key, unsigned char *iv, int enc);
 int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm,
         int *outl);

int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *x, int padding);
 int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *x, int keylen);
 int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr);
 int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *a);

const EVP_CIPHER *EVP_get_cipherbyname(const char *name);
 #define EVP_get_cipherbynid(a) EVP_get_cipherbyname(OBJ_nid2sn(a))
 #define EVP_get_cipherbyobj(a) EVP_get_cipherbynid(OBJ_obj2nid(a))

#define EVP_CIPHER_nid(e)             ((e)->nid)

 #define EVP_CIPHER_block_size(e)       ((e)->block_size)

 #define EVP_CIPHER_key_length(e)       ((e)->key_len)

 #define EVP_CIPHER_iv_length(e)                ((e)->iv_len)

 #define EVP_CIPHER_flags(e)            ((e)->flags)

 #define EVP_CIPHER_mode(e)             ((e)->flags) & EVP_CIPH_MODE)

 int EVP_CIPHER_type(const EVP_CIPHER *ctx);

#define EVP_CIPHER_CTX_cipher(e)      ((e)->cipher)

 #define EVP_CIPHER_CTX_nid(e)          ((e)->cipher->nid)

 #define EVP_CIPHER_CTX_block_size(e)   ((e)->cipher->block_size)

 #define EVP_CIPHER_CTX_key_length(e)   ((e)->key_len)

 #define EVP_CIPHER_CTX_iv_length(e)    ((e)->cipher->iv_len)

 #define EVP_CIPHER_CTX_get_app_data(e) ((e)->app_data)

 #define EVP_CIPHER_CTX_set_app_data(e,d) ((e)->app_data=(char *)(d))
 #define EVP_CIPHER_CTX_type(c)         EVP_CIPHER_type(EVP_CIPHER_CTX_cipher(c))
 #define EVP_CIPHER_CTX_flags(e)                ((e)->cipher->flags)

 #define EVP_CIPHER_CTX_mode(e)         ((e)->cipher->flags & EVP_CIPH_MODE)

int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type);
 int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type);

DESCRIPTION

Les routines de chiffrement EVP sont des interfaces de haut niveau pour certains algorithmes de chiffrement symétrique.

EVP_CIPHER_CTX_init() initialise le contexte de chiffrement ctx.

EVP_EncryptInit_ex() définit le contexte de chiffrement ctx pour un chiffrement avec l’algorithme de type de l’ENGINE impl. ctx doit être initialisé avant l’appel de cette fonction. type est normalement fourni par une fonction telle que EVP_des_cbc(). Si impl est NULL, alors l’implémentation par défaut est utilisée. key est la clef symétrique à utiliser et iv est le vecteur d'initialisation à utiliser (si nécessaire) ; le nombre réel d’octets à utiliser pour la clef et le vecteur dépend de l’algorithme. Il est possible de définir tous les paramètres à NULL à l’exception de type lors de l’appel initial et fournir les paramètres restants lors les prochains appels en ayant tous type définis à NULL. Cela est fait quand les paramètres de l’algorithme ne sont pas adéquats.

EVP_EncryptUpdate() chiffre inl octets du tampon in et écrit le résultat dans out. Cette fonction peut être appelée de multiples fois pour chiffrer des blocs successifs de données. Le total des données écrites est fonction de l’alignement des blocs : par conséquent, le total des données écrites peut être de zéro octet jusqu’à (inl + cipher_block_size − 1), aussi out doit être suffisamment grand. Le nombre réel d’octets écrits est placé dans outl.

Si le remplissage est activé (action par défaut), alors EVP_EncryptFinal_ex() chiffre les données « finales », c’est-à-dire les données restantes dans un bloc incomplet. Pour cela, le remplissage par bloc standard (alias remplissage PKCS) est utilisé. Les données finales chiffrées sont écrites dans out qui doit être suffisamment grand pour un bloc chiffré. Le nombre d’octets écrits est placé dans outl. Après l’appel de cette fonction l’opération de chiffrement est terminée et aucun appel ne peut plus être fait à EVP_EncryptUpdate().

Si le remplissage n’est pas activé, alors EVP_EncryptFinal_ex() ne chiffrera plus aucune donnée et une erreur sera renvoyée si quelques données subsistent dans un bloc incomplet : c’est-à-dire, la taille totale des données n’est pas un multiple de la taille du bloc.

EVP_DecryptInit_ex(), EVP_DecryptUpdate()et EVP_DecryptFinal_ex() sont les opérations de déchiffrement correspondantes. EVP_DecryptFinal() renverra un code d’erreur si le remplissage est activé et le bloc final non correctement formaté. Les paramètres et limitations sont identiques aux opérations de chiffrement à l’exception que, si le remplissage est activé, le tampon out des données déchiffrées transmis pour EVP_DecryptUpdate() doit être de taille suffisante pour (inl + cipher_block_size) octets, à moins que la taille du bloc de chiffrement soit 1, auquel cas inl octets sont suffisants.

EVP_CipherInit_ex(), EVP_CipherUpdate() et EVP_CipherFinal_ex() sont des fonctions qui peuvent être utilisées pour le chiffrement et le déchiffrement. L’opération réalisée dépend de la valeur du paramètre enc. Il doit être défini à 1 pour le chiffrement, 0 pour le déchiffrement et -1 pour ne pas changer sa valeur (la valeur du moment de « enc » fournie par un précédent appel).

EVP_CIPHER_CTX_cleanup() supprime toute donnée d’un contexte de chiffrement et libère toute mémoire qui lui soit allouée. Cette fonction doit être appelée après toute opération de chiffrement de façon qu’aucune donnée sensible ne subsiste en mémoire.

EVP_EncryptInit(), EVP_DecryptInit() et EVP_CipherInit() se comportent de manière similaire à EVP_EncryptInit_ex(), EVP_DecryptInit_ex et EVP_CipherInit_ex() à l’exception que les paramètres de ctx n’ont nul besoin d’être initialisés et utilisent toujours l’implémentation par défaut de l’algorithme de chiffrement.

EVP_EncryptFinal(), EVP_DecryptFinal() et EVP_CipherFinal() se comportent de manière similaire à EVP_EncryptFinal_ex(), EVP_DecryptFinal_ex() et EVP_CipherFinal_ex() à l’exception que ctx est automatiquement nettoyé après l’appel.

EVP_get_cipherbyname(), EVP_get_cipherbynid() et EVP_get_cipherbyobj() renvoient une structure EVP_CIPHER lorsqu’un nom d’algorithme de chiffrement, un NID ou une structure ASN1_OBJECT est fourni.

EVP_CIPHER_nid() et EVP_CIPHER_CTX_nid() renvoie l’identifiant NID d’un chiffrement lorsqu’une structure EVP_CIPHER ou EVP_CIPHER_CTX est fournie. La valeur courante du NID est une valeur interne qui pourrait ne pas avoir un OBJECT IDENTIFIER correspondant.

EVP_CIPHER_CTX_set_padding() autorise ou non le remplissage. Par défaut le remplissage des opérations de chiffrement est fait en utilisant le remplissage de bloc standard et est contrôlé puis supprimé lors du déchiffrement. Si le paramètre pad vaut zéro, alors aucun remplissage n’est réalisé, le total des données chiffrées ou déchiffrées doit alors être un multiple de la taille de bloc ou une erreur s’ensuivra.

EVP_CIPHER_key_length() et EVP_CIPHER_CTX_key_length() renvoient la longueur de clef d’un chiffrement quand une structure EVP_CIPHER ou EVP_CIPHER_CTX est fournie. La constante EVP_MAX_KEY_LENGTH est la longueur maximale de clef pour tous les algorithmes de chiffrement. Remarque : bien que EVP_CIPHER_key_length() est déterminée pour un algorithme de chiffrement, la valeur de EVP_CIPHER_CTX_key_length() peut être différente pour des longueurs de clef variables d’algorithme de chiffrement.

EVP_CIPHER_CTX_set_key_length() définit la longueur de clef d’un contexte de chiffrement. Si le chiffrement a une longueur fixe de clef, alors essayer de définir la longueur de clef à une valeur différente est fautif.

EVP_CIPHER_iv_length() et EVP_CIPHER_CTX_iv_length() renvoient la longueur du vecteur d'initialisation du chiffrement lorsque est fournie EVP_CIPHER ou EVP_CIPHER_CTX. Zéro sera renvoyé si l’algorithme de chiffrement n’utilise pas de vecteur d'initialisation. La constante EVP_MAX_IV_LENGTH est la longueur maximale du vecteur d'initialisation de tous les algorithmes de chiffrement.

EVP_CIPHER_block_size() et EVP_CIPHER_CTX_block_size3() renvoie la taille de bloc d’un chiffrement lorsqu'est fourni une structure EVP_CIPHER ou EVP_CIPHER_CTX. La constante EVP_MAX_IV_LENGTH est aussi la longueur maximale pour les algorithmes de chiffrement.

EVP_CIPHER_type() et EVP_CIPHER_CTX_type() renvoient le type des algorithmes de chiffrement ou de contexte. Ce « type » est l’identifiant NID réel de OBJECT IDENTIFIER du chiffrement et donc ignore les paramètres de l’algorithme, et RC2 40 bits et RC2 128 bits ont le même NID. Si l’algorithme n’a pas d’identifiant objet ou n’est pas pris en charge par ASN1, cette fonction renverra NID_undef.

EVP_CIPHER_CTX_cipher() renvoie la structure EVP_CIPHER lorsqu’est fournie une structure EVP_CIPHER_CTX.

EVP_CIPHER_mode() et EVP_CIPHER_CTX_mode() renvoient le mode de chiffrement par bloc : EVP_CIPH_ECB_MODE, EVP_CIPH_CBC_MODE, EVP_CIPH_CFB_MODE ou EVP_CIPH_OFB_MODE. Si le chiffrement est un chiffrement par flot, alors EVP_CIPH_STREAM_CIPHER est renvoyé.

EVP_CIPHER_param_to_asn1() définit le « paramètre » AlgorithmIdentifier en fonction de l’algorithme de chiffrement fourni. Classiquement, cela inclut n’importe quel paramètre et un vecteur d'initialisation. Le vecteur du chiffrement (s’il existe) doit être défini quand cet appel est fait. Cet appel doit être fait avant que l’algorithme soit pratiquement « utilisé » (avant n’importe quel appel EVP_EncryptUpdate(), EVP_DecryptUpdate() par exemple). Cette fonction peut échouer si l’algorithme n’est nullement pris en charge par ASN1.

EVP_CIPHER_asn1_to_param() définit les paramètres de l’algorithme de chiffrement en fonction des « paramètres » ASN1 AlgorithmIdentifier. L’effet exact dépend de l’algorithme. Dans le cas de RC2 par exemple, le vecteur d'initialisation et la clef utilisée seront définis. Cette fonction devrait être appelée après que le type de l’algorithme de base soit défini mais avant que la clef ne soit définie. Par exemple EVP_CipherInit() sera appelée avec le vecteur et la clef définis à NULL, EVP_CIPHER_asn1_to_param() sera appelée puis finalement EVP_CipherInit() le sera avec tous les paramètres sauf la clef définie à NULL. Il est possible que cette fonction échoue si l’algorithme n’est nullement pris en charge par ASN1 ou que les paramètres ne peuvent être définis (par exemple, la longueur réelle de la clef RC2 n’est pas prise en charge).

EVP_CIPHER_CTX_ctrl() permet de déterminer et définir les paramètres particuliers de différents algorithmes.

VALEURS DE RETOUR

EVP_EncryptInit_ex(), EVP_EncryptUpdate() et EVP_EncryptFinal_ex() renvoient 1 lors d’un succès et 0 lors d’un échec.

EVP_DecryptInit_ex() et EVP_DecryptUpdate() renvoient 1 lors d’un succès et 0 lors d’un échec. EVP_DecryptFinal_ex() renvoie 0 si le déchiffrement est un échec ou 1 si c’est une réussite.

EVP_CipherInit_ex() et EVP_CipherUpdate() renvoient 1 pour un succès et 0 pour un échec. EVP_CipherFinal_ex() renvoie 0 pour un échec de déchiffrement et 1 pour une réussite.

EVP_CIPHER_CTX_cleanup() renvoie 1 pour un succès et 0 pour un échec.

EVP_get_cipherbyname(), EVP_get_cipherbynid() et EVP_get_cipherbyobj() renvoient une structure EVP_CIPHER ou NULL en cas d’erreur.

EVP_CIPHER_nid() et EVP_CIPHER_CTX_nid() renvoient un identifiant NID.

EVP_CIPHER_block_size() et EVP_CIPHER_CTX_block_size() renvoient la taille de bloc.

EVP_CIPHER_key_length() et EVP_CIPHER_CTX_key_length() renvoient la longueur de clef.

EVP_CIPHER_CTX_set_padding() renvoie toujours 1.

EVP_CIPHER_iv_length() et EVP_CIPHER_CTX_iv_length() renvoient la longueur du vecteur d'initialisation ou 0 si l’algorithme de chiffrement n’utilise pas de vecteur.

EVP_CIPHER_type() et EVP_CIPHER_CTX_type() renvoient le NID du OBJECT IDENTIFIER de l’algorithme de chiffrement ou NID_undef s’il n’a aucun OBJECT IDENTIFIER de défini.

EVP_CIPHER_CTX_cipher() renvoie une structure EVP_CIPHER.

EVP_CIPHER_param_to_asn1() et EVP_CIPHER_asn1_to_param() renvoient 1 pour une réussite ou zéro pour un échec.

LISTE DES ALGORITHMES DE CHIFFREMENT

Tous les algorithmes ont une longueur fixe de clef sauf stipulation contraire.
EVP_enc_null()
Algorithme NULL, sans action
EVP_des_cbc(void), EVP_des_ecb(void), EVP_des_cfb(void), EVP_des_ofb(void)
Respectivement, DES avec les modes CBC, ECB, CFB et OFB.
EVP_des_ede_cbc(void), EVP_des_ede(), EVP_des_ede_ofb(void), EVP_des_ede_cfb(void)
Respectivement, triple DES à deux clefs avec les modes CBC, ECB, CFB et OFB.
EVP_des_ede3_cbc(void), EVP_des_ede3(), EVP_des_ede3_ofb(void), EVP_des_ede3_cfb(void)
Respectivement, triple DES à trois clefs avec les modes CBC, ECB, CFB et OFB.
EVP_desx_cbc(void)
Algorithme DESX avec le mode CBC.
EVP_rc4(void)
Chiffrement par flot RC4. Algorithme avec une longueur de clef variable, par défaut 128 bits.
EVP_rc4_40(void)
Algorithme de chiffrement RC4 avec une longueur de clef de 40 bits. Obsolète, de préférence utiliser EVP_rc4() et la fonction EVP_CIPHER_CTX_set_key_length().
EVP_idea_cbc() EVP_idea_ecb(void), EVP_idea_cfb(void), EVP_idea_ofb(void), EVP_idea_cbc(void)
Algorithme de chiffrement IDEA avec les modes CBC, ECB, CFB et OFB respectivement.
EVP_rc2_cbc(void), EVP_rc2_ecb(void), EVP_rc2_cfb(void), EVP_rc2_ofb(void)
Algorithme de chiffrement RC2 avec respectivement les modes CBC, ECB, CFB, et OFB. Algorithme avec une longueur de clef variable et un paramètre additionnel « effective key bits » ou « effective key length » (par défaut, défini à 128 bits).
EVP_rc2_40_cbc(void), EVP_rc2_64_cbc(void)
Algorithme de chiffrement RC2 avec le mode CBC et par défaut, une longueur de clef et une longueur de clef efficace de 40 et 64 bits. Obsolète, de préférence utiliser EVP_rc2_cbc(), EVP_CIPHER_CTX_set_key_length() et EVP_CIPHER_CTX_ctrl() pour définir la longueur de clef et la longueur de clef efficace.
EVP_bf_cbc(void), EVP_bf_ecb(void), EVP_bf_cfb(void), EVP_bf_ofb(void);
Algorithme de chiffrement Blowfish avec respectivement les modes CBC, ECB, CFB et OFB. Algorithme à longueur de clef variable.
EVP_cast5_cbc(void), EVP_cast5_ecb(void), EVP_cast5_cfb(void), EVP_cast5_ofb(void)
Algorithme de chiffrement CAST avec respectivement les modes CBC, ECB, CFB et OFB. Algorithme à longueur de clef variable.
EVP_rc5_32_12_16_cbc(void), EVP_rc5_32_12_16_ecb(void), EVP_rc5_32_12_16_cfb(void), EVP_rc5_32_12_16_ofb(void)
Algorithme de chiffrement RC5 avec respectivement les modes CBC, ECB, CFB et OFB. Algorithme à longueur de clef variable avec un paramètre additionnel « nombre de tours ». Par défaut, la longueur de clef est de 128 bits et le nombre de tours 12.
EVP_aes_128_gcm(void), EVP_aes_192_gcm(void), EVP_aes_256_gcm(void)
Mode AES Galois Counter (GCM) pour des clefs respectivement de 128, 192 et 256 bits. Ces algorithmes de chiffrement demandent des opérations de contrôle supplémentaires pour fonctionner correctement. Consultez la section Mode GCM ci-dessous pour plus de détails.
EVP_aes_128_ccm(void), EVP_aes_192_ccm(void), EVP_aes_256_ccm(void)
Mode AES Counter avec CBC-MAC (CCM) pour des clefs respectivement de 128, 192 et 256 bits. Ces algorithmes de chiffrement demandent des opérations de contrôle supplémentaires pour fonctionner correctement. Consultez la section Mode CCM ci-dessous pour plus de détails.

Mode GCM

Pour les algorithmes de chiffrement en mode GCM, le comportement de l’interface EVP est subtilement modifiée et plusieurs opérations de contrôle spécifiques à GCM sont prises en charge.

Pour indiquer n’importe quelle autre donnée d’authentification (AAD), un appel à EVP_CipherUpdate(), EVP_EncryptUpdate() ou EVP_DecryptUpdate() devrait être fait avec le paramètre de sortie out réglé à NULL.

Lors du déchiffrement, la valeur de retour de EVP_DecryptFinal() ou EVP_CipherFinal() renseigne sur la réussite de l’opération. En cas de non succès, l’opération d’authentification a échoué et aucune donnée de sortie ne doit pas être utilisée car corrompue.

Les contrôles suivants sont pris en charge dans le mode GCM :

 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, ivlen, NULL);

Indication de la longueur du vecteur d'initialisation pour GCM. Cet appel peut être fait seulement avant de définir un vecteur d’initialisation Sans appel, une longueur de vecteur GCM est utilisée (96 bits pour AES).
 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, taglen, tag);

Écriture de taglen octets de valeur de la balise dans le tampon indiqué par tag. Cet appel peut être fait seulement lors du chiffrement des données et après le traitement de toutes les données (p. ex., après un appel à EVP_EncryptFinal()).

 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, taglen, tag);

Définition de la balise attendue à taglen octets à partir de tag. Cet appel est seulement possible lors du déchiffrement des données et doit être fait avant le traitement de toute donnée (p. ex., avant n’importe quel appel EVP_DecryptUpdate()).

Consultez EXEMPLES ci-dessous par un exemple d’utilisation du mode GCM

Mode CCM

Le comportement des algorithmes de chiffrement de mode CCM est similaire au mode CCM mais avec quelques obligations supplémentaires et des valeurs de contrôle différentes.

Comme pour le mode GCM, n’importe quelle autre donnée d’authentification (AAD) est fournie en appelant EVP_CipherUpdate(), EVP_EncryptUpdate() ou EVP_DecryptUpdate() avec le paramètre out défini à NULL. En plus, la longueur du texte chiffré ou non doit être fournie à EVP_CipherUpdate(), EVP_EncryptUpdate() ou EVP_DecryptUpdate() avec les paramètres d’entrée et de sortie (in et out) définis à NULL et la longueur indiquée dans le paramètre inl.

Les contrôles suivants sont pris en charge dans le mode CCM :

 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_TAG, taglen, tag);

Cet appel est fait pour définir la valeur de la balise attendue CCM lors du déchiffrement, ou la longueur de la balise (avec le paramètre tag réglé à NULL) lors du chiffrement. La longueur de la balise est souvent M. Si elle n’est pas précisée, une valeur par défaut est utilisée (12 pour AES).

 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_L, ivlen, NULL);

Définition de la valeur L du CCM. Non définie, une valeur par défaut est utilisée (8 pour AES).

 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_IVLEN, ivlen, NULL);

Définition de la longueur (vecteur d'initialisation) circonstancielle du CGM. Cet appel peut seulement être fait avant de préciser la valeur du moment. La valeur du moment est donné par 15 - L, ainsi c’est sept par défaut pour AES.

NOTES

Lorsque cela est possible, l’interface EVP pour les algorithmes symétriques devrait être utilisée de préférence aux interfaces de bas niveau. Cela parce que le code devient évident pour l’algorithme utilisé et plus souple. De plus, l’interface EVP garantit l’utilisation de l’accélération de chiffrement particulière à certaines plateformes telles que AES-NI (l’interface de bas niveau n’offre aucune garantie).

Le remplissage PKCS est réalisé en ajoutant n octets de valeur n pour que la longueur totale des données chiffrées soit un multiple de la taille de bloc. Comme le remplissage est toujours réalisé, si la taille des données est déjà un multiple de la taille de bloc, n sera égal à la taille de bloc. Par exemple, si la taille de bloc est 8 et 11 octets sont à chiffrés, alors 5 bits de remplissage de valeur 5 seront ajoutés.

Lors du déchiffrement, le bloc terminal est contrôlé pour s’assurer de sa forme correcte.

Bien que l’opération de déchiffrement puisse produire une erreur si le remplissage est activé, cela n’est pas un test fort pour l’exactitude des données d’entrée ou de la clef. Un bloc aléatoire a au mieux une chance sur 256 d’être d’un format correct et les problèmes avec les données précédentes ne provoqueront pas une erreur finale de déchiffrement.

Si le remplissage est activé, l’opération de déchiffrement sera toujours réussie si le total des données est un multiple de la taille de bloc.

Les fonctions EVP_EncryptInit(), EVP_EncryptFinal(), EVP_DecryptInit(), EVP_CipherInit() et EVP_CipherFinal() sont obsolètes mais sont conservées pour des raisons de compatibilité avec le code existant. EVP_EncryptInit_ex(), EVP_EncryptFinal_ex(), EVP_DecryptInit_ex(), EVP_DecryptFinal_ex(), EVP_CipherInit_ex() et EVP_CipherFinal_ex() doivent être utilisées car elles peuvent réutiliser le contexte existant sans avoir à allouer ou libérer à chaque appel.

BOGUES

Pour RC5, le nombre de tours peut être actuellement être 8, 12 ou 16. C’est une limitation du code RC5 actuel plutôt que de l’interface EVP.

EVP_MAX_KEY_LENGTH et EVP_MAX_IV_LENGTH font seulement référence aux algorithmes internes de chiffrement avec des longueurs de clef par défaut. Si des algorithmes personnalisés dépassent ces longueurs, les résultats sont imprévisibles. Cela est dû au fait qu’en pratique une clef générique est définie en un tableau « unsigned char » contenant EVP_MAX_KEY_LENGTH.

Le code ASN1 est incomplet (et parfois inexact), il a été testé pour certains algorithmes communs S/MIME (RC2, DES, triple DES) avec le mode CBC.

EXEMPLES

Chiffrer une chaîne en utilisant IDEA :

 int do_crypt(char *outfile)
        {
        unsigned char outbuf[1024];
        int outlen, tmplen;
        /* Clef et VI bogués : normalement définis à partir
         * d’une autre source.
         */
        unsigned char key[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        unsigned char iv[] = {1,2,3,4,5,6,7,8};
        char intext[] = "Un texte chiffré";
        EVP_CIPHER_CTX ctx;
        FILE *out;
        EVP_CIPHER_CTX_init(&ctx);
        EVP_EncryptInit_ex(&ctx, EVP_idea_cbc(), NULL, key, iv);
        if(!EVP_EncryptUpdate(&ctx, outbuf, &outlen, intext, strlen(intext)))
                {
                /* Erreur */
                return 0;
                }
        /* Le tampon fourni à EVP_EncryptFinal() doit, après les données
         * être juste chiffré pour éviter d’être surchargé.
         */
        if(!EVP_EncryptFinal_ex(&ctx, outbuf + outlen, &tmplen))
                {
                /* Erreur */
                return 0;
                }
        outlen += tmplen;
        EVP_CIPHER_CTX_cleanup(&ctx);
        /* Mode binaire nécessaire pour fopen car les données chiffrées sont
         * des données binaires. strlen() ne peut être utilisée car
         * elles peuvent n’être terminées par NULL et peuvent comporter des
         * NULL.
         */
        out = fopen(outfile, "wb");
        fwrite(outbuf, 1, outlen, out);
        fclose(out);
        return 1;
        }

Le texte chiffré de l’exemple ci-dessus peut être décodé en utilisant l’utilitaire openssl avec la ligne de commande (montrée sur deux lignes par souci de clarté) :

 openssl idea -d <fichier
          -K 000102030405060708090A0B0C0D0E0F -iv 0102030405060708

Exemple général de chiffrement et déchiffrement utilisant FILE I/O et AES128 avec une clef de 128 bits :

 int do_crypt(FILE *in, FILE *out, int do_encrypt)
        {
        /* Allocation d’assez d’espace dans tampon sortie pour bloc additionnel */
        unsigned char inbuf[1024], outbuf[1024 + EVP_MAX_BLOCK_LENGTH];
        int inlen, outlen;
        EVP_CIPHER_CTX ctx;
        /* Clef et VI bogués : normalement définis à partir
         * d’une autre source.
         */
        unsigned char key[] = "0123456789abcdeF";
        unsigned char iv[] = "1234567887654321";
        /* Ne pas définir maintenant la clef ou le vecteur, vérif des longueurs */
        EVP_CIPHER_CTX_init(&ctx);
        EVP_CipherInit_ex(&ctx, EVP_aes_128_cbc(), NULL, NULL, NULL,
                do_encrypt);
        OPENSSL_assert(EVP_CIPHER_CTX_key_length(&ctx) == 16);
        OPENSSL_assert(EVP_CIPHER_CTX_iv_length(&ctx) == 16);
        /* Maintenant définir la clef et le vecteur d'initialisation  */
        EVP_CipherInit_ex(&ctx, NULL, NULL, key, iv, do_encrypt);
        for(;;) 
                {
                inlen = fread(inbuf, 1, 1024, in);
                if(inlen <= 0) break;
                if(!EVP_CipherUpdate(&ctx, outbuf, &outlen, inbuf, inlen))
                        {
                        /* Erreur */
                        EVP_CIPHER_CTX_cleanup(&ctx);
                        return 0;
                        }
                fwrite(outbuf, 1, outlen, out);
                }
        if(!EVP_CipherFinal_ex(&ctx, outbuf, &outlen))
                {
                /* Erreur */
                EVP_CIPHER_CTX_cleanup(&ctx);
                return 0;
                }
        fwrite(outbuf, 1, outlen, out);
        EVP_CIPHER_CTX_cleanup(&ctx);
        return 1;
        }

HISTORIQUE

EVP_CIPHER_CTX_init(), EVP_EncryptInit_ex(), EVP_EncryptFinal_ex(), EVP_DecryptInit_ex(), EVP_DecryptFinal_ex(), EVP_CipherInit_ex(), EVP_CipherFinal_ex() et EVP_CIPHER_CTX_set_padding() sont apparues dans OpenSSL 0.9.7.

IDEA est apparu dans OpenSSL 0.9.7 mais a été souvent désactivé dû à des problèmes de droits ; le dernier brevet a expiré en 2012.

TRADUCTION

La traduction de cette page de manuel est maintenue par les membres de la liste <debian-l10n-french AT lists DOT debian DOT org>. Veuillez signaler toute erreur de traduction par un rapport de bogue sur le paquet manpages-fr-extra.