Introduction
Ces fonctions permettent d'accéder à la bibliothèque mcrypt, qui dispose d'une grande variété d'algorithmes de chiffrement, tels DES, TripleDES, Blowfish (par défaut), 3-WAY, SAFER-SK64, SAFER-SK128, TWOFISH, TEA, RC2 et GOST en modes CBC, OFB, CFB et ECB. De plus, elles acceptent aussi RC6 et IDEA qui sont considérés comme "non-libres".
Pré-requis
Ces fonctions utilisent » mcrypt
. Pour utiliser cette bibliothèque, téléchargez le fichier libmcrypt-x.x.tar.gz
sur » http://mcrypt.sourceforge.net/
et suivez les instructions d'installation fournies. Les utilisateurs Windows trouveront toutes les bibliothèques nécessaires sur » http://files.edin.dk/php/win32/mcrypt/
.
Depuis PHP 5.0.0, vous avez besoin de la version 2.5.6 ou suivant de la bibliothèque libmcrypt.
Si vous compilez PHP avec la bibliothèque libmcrypt 2.4.x
, les algorithmes suivants sont supportés : CAST, LOKI97, RIJNDAEL, SAFERPLUS, SERPENT ainsi que les chiffrements suivants : ENIGMA (chiffrement), PANAMA, RC4 et WAKE. Avec libmcrypt 2.4.x
un autre mode de chiffrement est disponible : nOFB.
Installation
Vous devez compiler PHP avec l'option --with-mcrypt=[DIR]
pour activer cette extension. DIR est le dossier d'installation de mcrypt. Assurez-vous de compiler libmcrypt avec l'option --disable-posix-threads
.
Configuration à l'exécution
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini
.
Tableau 167. Options de configuration
Nom |
Par défaut |
Modifiable |
Historique |
mcrypt.algorithms_dir |
NULL |
PHP_INI_ALL |
Disponible depuis PHP 4.0.2. |
mcrypt.modes_dir |
NULL |
PHP_INI_ALL |
Disponible depuis PHP 4.0.2. |
Pour plus de détails sur les constantes PHP_INI_*, reportez-vous à
Annexe I, Directives du php.ini
.
Types de ressources
mcrypt_module_open()
retourne un descripteur de cryptage.
Constantes pré-définies
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
Mcrypt peut opérer en 4 modes de chiffrement (CBC, OFB, CFB, et ECB). Si vous utilisez libmcrypt-2.4.x ou plus récent, les fonctions peuvent aussi opérer en mode nOFB et en mode STREAM. Nous allons présenter la technique d'utilisation de ces modes. Pour plus de références et de détails, reportez-vous au livre suivant : Applied Cryptography by Schneier (ISBN 0-471-11709-9).
- MCRYPT_MODE_ECB (electronic codebook) est prévu pour des données aléatoires, telles que des clés. Comme les données sont peu nombreuses et aléatoires, les inconvénients de l'ECB ont ici un effet négatif favorable.
- MCRYPT_MODE_CBC (cipher block chaining) est spécialement pratique avec les fichiers dont la sécurité ECB n'est pas suffisante.
- MCRYPT_MODE_CFB (cipher feedback) est la meilleure méthode pour chiffrer des flots d'octets, quand les octets doivent être cryptés un par un.
- MCRYPT_MODE_OFB (output feedback, in 8bit) est comparable à CFB, mais peut être utilisé lorsque des erreurs ne doivent pas être propagées.
- MCRYPT_MODE_NOFB (output feedback, in nbit) est comparable à OFB, mais plus sûr, car il opère avec la taille de blocs de l'algorithme.
- MCRYPT_MODE_STREAM est un mode supplémentaire, pour permettre l'utilisation d' algorithmes tels WAKE ou RC4.
Voici quelques autres modes et méthodes de compression :
Mcrypt ciphers
Voici une liste non exhaustive des modes de chiffrement de l'extension mcrypt. Pour disposer d'une liste complète des chiffrements supportés, voyez les définitions dans le fichier mcrypt.h
. La règle générale avec l'API mcrypt-2.2.x API est que vous pouvez accéder au mode de chiffrement depuis PHP avec la constante MCRYPT_ciphername. Avec la bibliothèque libmcrypt-2.4.x et libmcrypt-2.5.x, ces constantes fonctionnent toujours, mais il est possible de spécifier le nom du chiffrement dans une chaîne, lors de l'appel à mcrypt_module_open()
.
- MCRYPT_3DES
- MCRYPT_ARCFOUR_IV
(libmcrypt > 2.4.x seulement)
- MCRYPT_ARCFOUR
(libmcrypt > 2.4.x seulement)
- MCRYPT_BLOWFISH
- MCRYPT_CAST_128
- MCRYPT_CAST_256
- MCRYPT_CRYPT
- MCRYPT_DES
- MCRYPT_DES_COMPAT
(libmcrypt 2.2.x seulement)
- MCRYPT_ENIGMA
(libmcrypt > 2.4.x seulement, alias de MCRYPT_CRYPT
)
- MCRYPT_GOST
- MCRYPT_IDEA
(non-free)
- MCRYPT_LOKI97
(libmcrypt > 2.4.x seulement)
- MCRYPT_MARS
(libmcrypt > 2.4.x seulement, non-libre)
- MCRYPT_PANAMA
(libmcrypt > 2.4.x seulement)
- MCRYPT_RIJNDAEL_128
(libmcrypt > 2.4.x seulement)
- MCRYPT_RIJNDAEL_192
(libmcrypt > 2.4.x seulement)
- MCRYPT_RIJNDAEL_256
(libmcrypt > 2.4.x seulement)
- MCRYPT_RC2
- MCRYPT_RC4
(libmcrypt 2.2.x seulement)
- MCRYPT_RC6
(libmcrypt > 2.4.x seulement)
- MCRYPT_RC6_128
(libmcrypt 2.2.x seulement)
- MCRYPT_RC6_192
(libmcrypt 2.2.x seulement)
- MCRYPT_RC6_256
(libmcrypt 2.2.x seulement)
- MCRYPT_SAFER64
- MCRYPT_SAFER128
- MCRYPT_SAFERPLUS
(libmcrypt > 2.4.x seulement)
- MCRYPT_SERPENT
(libmcrypt > 2.4.x seulement)
- MCRYPT_SERPENT_128
(libmcrypt 2.2.x seulement)
- MCRYPT_SERPENT_192
(libmcrypt 2.2.x seulement)
- MCRYPT_SERPENT_256
(libmcrypt 2.2.x seulement)
- MCRYPT_SKIPJACK
(libmcrypt > 2.4.x seulement)
- MCRYPT_TEAN
(libmcrypt 2.2.x seulement)
- MCRYPT_THREEWAY
- MCRYPT_TRIPLEDES
(libmcrypt > 2.4.x seulement)
- MCRYPT_TWOFISH
(pour les vieilles versions mcrypt 2.x, ou mcrypt > 2.4.x )
- MCRYPT_TWOFISH128
(les TWOFISH
xxx sont disponibles dans les nouvelles versions 2.x, mais pas dans les versions 2.4.x)
- MCRYPT_TWOFISH192
- MCRYPT_TWOFISH256
- MCRYPT_WAKE
(libmcrypt > 2.4.x seulement)
- MCRYPT_XTEA
(libmcrypt > 2.4.x seulement)
Vous devez (mode OFB
et OFB
) ou pouvez (mode CBC
) fournir un vecteur d'initialisation (IV) pour ces modes de chiffrement. IV doit être unique, et avoir la même valeur au chiffrement et au déchiffrement. Pour des données qui seront enregistrées après chiffrement, vous pouvez prendre le résultat d'une fonction telle que MD5, appliquée sur le nom du fichier. Sinon, vous pouvez envoyer IV avec les données chiffrées, (reportez-vous au chapitre 9.3 de Applied Cryptography by Schneier (ISBN 0-471-11709-9) de Schneier (ISBN 0-471-11709-9) pour plus de détails sur le sujet).
Exemples
Mcrypt permet de chiffrer et de déchiffrer en utilisant les méthodes mentionnées ci-dessus. Les 4 commandes importantes mcrypt_cfb()
, mcrypt_cbc()
, mcrypt_ecb()
et mcrypt_ofb()
) peuvent toutes opérer en mode MCRYPT_ENCRYPT
et MCRYPT_DECRYPT
.
Exemple 1438. Chiffre une valeur avec un TripleDES, en mode ECB.
<?php
$key
=
"Cette clé est ultra-secrète"
;
$input
=
"Rencontrons-nous dans notre place secrète à 9 h 00."
;
$encrypted_data
=
mcrypt_ecb
(
MCRYPT_TripleDES
,
$key
,
$input
,
MCRYPT_ENCRYPT
);
?>
Cet exemple va retourner les données cryptées dans la variable $encrypted_data.
Si vous avez compilé PHP avec libmcrypt 2.4.x, ces fonctions sont toujours disponibles, mais il est vivement conseillé d'utiliser les nouvelles fonctions avancées.
Exemple 1439. Cryptage d'une valeur avec TripleDES sous 2.4.x en mode ECB
<?php
$key
=
"Ceci est une vraie clé secrète"
;
$input
=
"Rendez-vous à 9 heures, dans notre planque."
;
$td
=
mcrypt_module_open
(
MCRYPT_TripleDES
,
""
,
MCRYPT_MODE_ECB
,
""
);
$iv
=
mcrypt_create_iv
(
mcrypt_enc_get_iv_size
(
$td
),
MCRYPT_RAND
);
mcrypt_generic_init
(
$td
,
$key
,
$iv
);
$encrypted_data
=
mcrypt_generic
(
$td
,
$input
);
mcrypt_generic_end
(
$td
);
?>
Cet exemple va retourner les données cryptées dans la variable
$encrypted_data
. Pour un exemple complet, voyez
mcrypt_module_open()
.
Table des matières
- mcrypt_cbc
— Chiffre/déchiffre des données en mode CBC
- mcrypt_cfb
— Chiffre/déchiffre des données en mode CFB
- mcrypt_create_iv
— Crée un vecteur d'initialisation à partir d'une source aléatoire
- mcrypt_decrypt
— Déchiffre un texte avec les paramètres donnés
- mcrypt_ecb
— Obsolète : Chiffre/déchiffre des données en mode ECB
- mcrypt_enc_get_algorithms_name
— Retourne le nom de l'algorithme
- mcrypt_enc_get_block_size
— Retourne la taille de blocs d'un algorithme
- mcrypt_enc_get_iv_size
— Retourne la taille du VI d'un algorithme
- mcrypt_enc_get_key_size
— Retourne la taille maximale de la clé pour un mode
- mcrypt_enc_get_modes_name
— Retourne le nom du mode
- mcrypt_enc_get_supported_key_sizes
— Retourne un tableau contenant les tailles de clés acceptées par un algorithme
- mcrypt_enc_is_block_algorithm_mode
— Teste le chiffrement par blocs d'un mode
- mcrypt_enc_is_block_algorithm
— Teste le chiffrement par blocs d'un algorithme
- mcrypt_enc_is_block_mode
— Teste si le mode retourne les données par blocs
- mcrypt_enc_self_test
— Teste un module ouvert
- mcrypt_encrypt
— Chiffre un texte
- mcrypt_generic_deinit
— Prépare le module pour le déchargement
- mcrypt_generic_end
— Termine un chiffrement
- mcrypt_generic_init
— Initialise tous les buffers nécessaires
- mcrypt_generic
— Chiffre les données
- mcrypt_get_block_size
— Retourne la taille de blocs d'un chiffrement
- mcrypt_get_cipher_name
— Lit le nom du chiffrement utilisé
- mcrypt_get_iv_size
— Retourne la taille du VI utilisé par un couple chiffrement/mode
- mcrypt_get_key_size
— Retourne la taille de la clé d'un chiffrement
- mcrypt_list_algorithms
— Liste tous les algorithmes de chiffrement supportés
- mcrypt_list_modes
— Liste tous les modes de chiffrement supportés
- mcrypt_module_close
— Décharge le module de chiffrement
- mcrypt_module_get_algo_block_size
— Retourne la taille de blocs d'un algorithme
- mcrypt_module_get_algo_key_size
— Retourne la taille maximale de clé
- mcrypt_module_get_supported_key_sizes
— Retourne un tableau contenant les tailles de clés supportées par un algorithme de chiffrement
- mcrypt_module_is_block_algorithm_mode
— Indique si un mode fonctionne par blocs
- mcrypt_module_is_block_algorithm
— Indique si un algorithme fonctionne par blocs
- mcrypt_module_is_block_mode
— Indique si un mode travaille par blocs
- mcrypt_module_open
— Ouvre le module de l'algorithme et du mode à utiliser
- mcrypt_module_self_test
— Teste un mode
- mcrypt_ofb
— Chiffre/déchiffre des données en mode OFB
- mdecrypt_generic
— Déchiffre