Ces fonctions utilisent mcrypt.
Ces fonctions permettent d'accéder à la librairie
mcrypt, qui dispose d'une grande variété d'algorithmes
de chiffrage, tels que 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, elle accepte aussi RC6 et IDEA qui sont
considérés comme "non libre".
Si vous compilez PHP avec la librairie libmcrypt 2.4.x, les algorithmes
suivants sont supportés : CAST, LOKI97, RIJNDAEL, SAFERPLUS,
SERPENT ainsi que les chiffrements suivants : ENIGMA (chiffrage), PANAMA,
RC4 et WAKE. Avec libmcrypt 2.4.x un autre mode de chiffrement
est disponible : nOFB.
Pour l'utiliser, téléchargez la librairie
libmcrypt-x.x.tar.gz par ici
et suivez les instructions d'installations incluses. Vous aurez aussi besoin
de compiler PHP avec le paramètre
--with-mcrypt
pour activer cette extension.
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 cle est ultra-secrete";
$input = "Rencontrons-nous dans notre place secrete a 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. Encryption d'une valeur avec TripleDES sous 2.4.x en mode ECB <?php
$key = "Ceci est une vraie cle secrete";
$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.
Mcrypt peut opérer en 4 modes de chiffrage (CBC, OFB, CFB, et ECB).
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 par Schneier (ISBN 0-471-11709-9).
ECB (electronic codebook) ECB (electronic codebook) est prévu pour
des données aléatoires, telles que des clés. Etant
donné que les données sont peu nombreuses et aléatoires,
les inconvénients de l'ECB ont ici un effet négatif favorable.
CBC (cipher block chaining) est spécialement pratique avec les
fichiers dont la sécurité ECB n'est pas suffisante.
CFB (cipher feedback) est la meilleure méthode pour chiffrer des
flots d'octets, quand les octets doivent être encryptés un
par un.
OFB (output feedback) est comparable à CFB, mais peut être
utilisé lorsque des erreurs ne doivent pas être propagées.
nOFB (output feedback, in nbit) est comparable à OFB, mais
plus sÛr, car il opère avec la taille de blocs de l'algorithme.
STREAM est un mode supplémentaire, pour permettre l'utilisation d'
algorithmes tels que WAKE ou RC4.
PHP ne supporte par encore le chiffrage des flots d'octets.
Pour l'instant, PHP n'accepte que le chiffrage de chaîne.
Pour obtenir la liste complète des modes de chiffrement, reportez
vous aux derniers #define, dans le fichier mcrypt.h.
En règle générale, vous pouvez accéder à
une méthode de chiffrement avec l'option MCRYPT_nomDuChiffrement.
Voici une liste non exhaustive des modes de chiffrement de l'extension
mcrypt. Si un chiffrement n'est pas dans cette liste, mais disponible dans
la librairie, vous pouvez supposer que cette documentation est hors d'âge.
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 (payant)
MCRYPT_LOKI97 (libmcrypt 2.4.x seulement)
MCRYPT_MARS (libmcrypt 2.4.x seulement, payant)
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 anciennes versions de mcrypt 2.x versions,
ou mcrypt 2.4.x )
MCRYPT_TWOFISH128 (TWOFISHxxx sont disponibles avec les nouvelles
versions de 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 CFB 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) pour plus de
détails sur le sujet).