LXX. chiffrement mcrypt
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".
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://ftp.emini.dk/pub/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.
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.
Le comportement de ces fonctions est
affecté par la configuration dans le fichier php.ini.
Tableau 1. 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 H.
Cette extension ne définit aucune ressource. 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 :
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 TWOFISHxxx 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).
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 1. 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 2. 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().
|