Filtres de chiffrement

mcrypt.* et mdecrypt.* fournissent un système de chiffrement symétrique basé sur libmcrypt. Les deux filtres supportent les mêmes algorithmes disponibles avec la bibliothèque mcrypt, sous la forme de la directive mcrypt.ciphernameciphername est le nom du chiffrement qui sera passé à mcrypt_module_open(). Les cinq paramètres suivants sont aussi disponibles :

Paramètres du filtre mcrypt
Paramètre Obligatoire Par défaut Valeurs possibles
mode Optionnel cbc cbc, cfb, ecb, nofb, ofb, stream
algorithms_dir Optionnel ini_get('mcrypt.algorithms_dir') Chemin vers les algorithmes de modules
modes_dir Optionnel ini_get('mcrypt.modes_dir') Chemin vers les modes de modules
iv Obligatoire N/A Généralement 8, 16 ou 32 octets de données binaires. Dépend du chiffrement
key Obligatoire N/A Généralement 8, 16 ou 32 octets de données binaires. Dépend du chiffrement

Exemple #1 Chiffrement d'un fichier avec 3DES

<?php
$passphrase 
'My secret';

/* Transforme un mot de passe humain
 * en une paire iv/clé
 */
$iv substr(md5('iv'.$passphrasetrue), 08);
$key substr(md5('pass1'.$passphrasetrue) . 
               
md5('pass2'.$passphrasetrue), 024);
$opts = array('iv'=>$iv'key'=>$key);

$fp fopen('secret-file.enc''wb');
stream_filter_append($fp'mcrypt.tripledes'STREAM_FILTER_WRITE$opts);
fwrite($fp'Secret secret secret data');
fclose($fp);
?>

Exemple #2 Lecture d'un fichier chiffré

<?php
$passphrase 
'My secret';

/* Transforme un mot de passe humain
 * en une paire iv/clé
 */
$iv substr(md5('iv'.$passphrasetrue), 08);
$key substr(md5('pass1'.$passphrasetrue) . 
               
md5('pass2'.$passphrasetrue), 024);
$opts = array('iv'=>$iv'key'=>$key);

$fp fopen('secret-file.enc''rb');
stream_filter_append($fp'mdecrypt.tripledes'STREAM_FILTER_READ$opts);
$data rtrim(stream_get_contents($fp));
fclose($fp);

echo 
$data;
?>
add a note add a note

User Contributed Notes 1 note

up
1
Uwe Ohse
1 month ago
1) The mcrypt module has been deprecated with PHP 7.1.
What does that mean for the encryption filters?

2) deriving the IV from the secret passphrase seems wrong. This leaks information about the passphrase without need.

3) using md5() for this? Really? hash() has been available since PHP 5.1.2.

4) hashing the passphrase twice does not add any security.

5) using substr() on binary data (why, oh why, is true passed to md5()?) might lead to headaches if mbstring.func_overload is used.
To Top