SunshinePHP Developer Conference 2015

mcrypt_module_open

(PHP 4 >= 4.0.2, PHP 5)

mcrypt_module_openOuvre le module de l'algorithme et du mode à utiliser

Description

resource mcrypt_module_open ( string $algorithm , string $algorithm_directory , string $mode , string $mode_directory )

mcrypt_module_open() ouvre le module de l'algorithme et du mode à utiliser. Le nom de l'algorithme est spécifié par le paramètre algorithm (par exemple : "twofish"), ou bien une des constantes MCRYPT_ciphername. La bibliothèque est refermée en appelant mcrypt_module_close().

Liste de paramètres

algorithm

Une constante parmi les constantes MCRYPT_ciphername, ou le nom de l'algorithme, sous la forme d'une chaîne de caractères.

algorithm_directory

Le paramètre algorithm_directory est utilisé pour localiser le module de cryptage. Lorsque vous spécifiez un nom de dossier, il sera utilisé. Si vous spécifiez une chaîne vide (""), la valeur définie dans la directive mcrypt.algorithms_dir du fichier php.ini sera utilisée. Lorsqu'elle n'est pas définie, le dossier par défaut utilisé sera celui dans lequel se trouve la bibliothèque libmcrypt (habituellement, /usr/local/lib/libmcrypt).

mode

Une constantes parmi les constantes MCRYPT_MODE_modename, ou une des chaînes suivantes : "ecb", "cbc", "cfb", "ofb", "nofb" ou "stream".

mode_directory

Le paramètre mode_directory est utilisé pour localiser le module de cryptage. Si un nom de dossier est spécifié, il sera utilisé. Lorsque vous spécifiez une chaîne vide (""), la valeur de la directive mcrypt.modes_dir du fichier php.ini sera utilisée. Si elle n'est pas définie, le dossier par défaut utilisé sera celui dans lequel se trouve la bibliothèque libmcrypt (habituellement /usr/local/lib/libmcrypt).

Valeurs de retour

Normalement, cette fonction retourne un descripteur de cryptage, ou FALSE si une erreur survient.

Exemples

Exemple #1 Exemple avec mcrypt_module_open()

<?php
$td 
mcrypt_module_open(MCRYPT_DES'',
    
MCRYPT_MODE_ECB'/usr/lib/mcrypt-modes');

$td mcrypt_module_open('rijndael-256''''ofb''');
?>

La première ligne de l'exemple ci-dessus va essayer d'ouvrir le chiffrement DES, dans le dossier par défaut, et le mode ECB dans le dossier /usr/lib/mcrypt-modes. Le second exemple utilise les chaînes comme nom pour le chiffrement et le mode. Cela ne fonctionne que si l'extension est compilée avec libmcrypt 2.4.x or 2.5.x.

Exemple #2 Utilisation de mcrypt_module_open() pour chiffrer

<?php
/* Charge un chiffrement */
$td mcrypt_module_open('rijndael-256''''ofb''');

/* Crée le VI et détermine la taille de la clé */
$iv mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);
$ks mcrypt_enc_get_key_size($td);

/* Crée la clé */
$key substr(md5('very secret key'), 0$ks);

/* Intialise le chiffrement */
mcrypt_generic_init($td$key$iv);

/* Chiffre les données */
$encrypted mcrypt_generic($td'This is very important data');

/* Libère le gestionnaire de chiffrement */
mcrypt_generic_deinit($td);

/* Initialise le module de chiffrement pour le déchiffrement */
mcrypt_generic_init($td$key$iv);

/* Déchiffre les données */
$decrypted mdecrypt_generic($td$encrypted);

/* Libère le gestionnaire de déchiffrement, et ferme le module */
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

/* Affiche la chaîne */
echo trim($decrypted)."\n";
?>

Voir aussi

add a note add a note

User Contributed Notes 6 notes

up
1
dinamic at gmail dot com
6 years ago
Also it should be pointed that md5() and/or sha1() should not be used while forming your key for the mcrypt. This is so because hex encoding uses a set of only 16 characters [0-9a-f], which is equivalent to 4 bits, and thus halve the strength of your encryption: 4 x 32 = 128-bit.

I have re-wrote the example shown, so here is my suggestion to get real 256-bit encryption:

<?php
$key1
= "this is a secret key";
$key2 = "this is the second secret key";
$input = "Let us meet at 9 o'clock at the secret place.";
$length = strlen($input);

   
/* Open the cipher */
   
$td = mcrypt_module_open('rijndael-256', '', 'cbc', '');

   
/* Create the IV and determine the keysize length, use MCRYPT_RAND
     * on Windows instead */
   
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
   
$ks = mcrypt_enc_get_key_size($td);

   
/* Create key */
   
$key1 = md5($key1);
   
$key2 = md5($key2);

   
$key = substr($key1, 0, $ks/2) . substr(strtoupper($key2), (round(strlen($key2) / 2)), $ks/2);

   
$key = substr($key.$key1.$key2.strtoupper($key1),0,$ks);

   
/* Intialize encryption */
   
mcrypt_generic_init($td, $key, $iv);

   
/* Encrypt data */
   
$encrypted = mcrypt_generic($td, $input);

   
/* Terminate encryption handler */
   
mcrypt_generic_deinit($td);

   
/* Initialize encryption module for decryption */
   
mcrypt_generic_init($td, $key, $iv);

   
/* Decrypt encrypted string */
   
$decrypted = mdecrypt_generic($td, $encrypted);

   
/* Terminate decryption handle and close module */
   
mcrypt_generic_deinit($td);
   
mcrypt_module_close($td);

   
/* Show string */
   
echo "Text: ".substr($decrypted,0,$length) . "<br>";
    echo
"Encoded: ".$encrypted ."<br>";
    echo
"<br>key1: $key1 <br>key2: $key2<br>created key: $key";
?>
up
0
Mark
1 year ago
for errors like
' mcrypt_module_open(): Could not open encryption module in '

Make sure you're using the right name. The page giving the list of ciphers is NOT the right way to say each cipher (shown here http://www.php.net/manual/en/mcrypt.ciphers.php).

In order to see what ones are supported, try phpinfo(); and look under mcrypt to find something like this

mcrypt support => enabled
mcrypt_filter support => enabled
Version => 2.5.8
Api No => 20021217
Supported ciphers => cast-128 gost rijndael-128 twofish arcfour cast-256 loki97 rijndael-192 saferplus wake blowfish-compat des rijndael-256
serpent xtea blowfish enigma rc2 tripledes
Supported modes => cbc cfb ctr ecb ncfb nofb ofb stream
up
0
lehmann*at*arcor-so.net
5 years ago
Keep in mind that the mcrypt functions do not implement padding like e.g. pkcs#5. This causes the problem with zero bytes at the end and the sting cannot be correctly decoded in other environments.

For an example how to add pkcs 5 padding, see ref.mcrypt.php
up
0
royconejo
5 years ago
about the previous comments on hex formatting and capitalization as a way to improve the key:

this would seem pretty obvious, but it is a choice to be limited to only hex characters ([0-9a-z]); you can get the original RAW output from md5() or sha1() and not the default readable hex formatting.

the result of a raw output will be 16 o 20 (depending on the hash function being used) series of chars in the range 0-255. way better than [0-9a-z] and even [0-9a-zA-Z].

16 or 20 is generally lower than the maximum key lenght ($ks in the example), but you can append two or more keys together:

<?php
$human_key1
= 'something very secret';
$human_key2 = 'something else very secret';

// 40 bytes binary key using two "human readable" keys and sha1.
$bigger_binary_key = sha1($human_key1, true) . sha1($human_key2, true);

// then just use it as you would (extract taken from the example)
$key = substr($bigger_binary_key, 0, $ks);
?>

... or you can automatically split one large "human key" into two or more parts, hash those parts with sha1 (raw output!) and merge them together again (in original order or rearrange, salt, transform them as you like) to get a binary key of 40, 60, 80 or more chars depending on the number of parts the secret key has been splitted =)
up
0
ash
6 years ago
A slight improvement of dinamic's function to create a key:

I think the weak point is that capitals are always used in the same part of the string. The following code capitalizes random characters of the string, making the key less predictable:

<?php
$key
= substr($key1, 0, $ks/2) . substr($key2, (round(strlen($key2) / 2)), $ks/2);
$key = substr($key.$key1.$key2.$key1,0,$ks);

$buffer = str_split($key);

$limit = count($buffer)-1;
srand((float)microtime() * 1000000);

$end = rand(0, $limit);
$a = 0;

// replace random chars with capitals
while ($a < $end) {   
    list(
$usec, $sec) = explode(' ', microtime());
       
$seed = ((float)$sec) + ((float) $usec * 100000);
   
mt_srand($seed);
   
   
$index = mt_rand(0,$limit);
   
   
$buffer[$index] = strtoupper($buffer[$index]);
   
$a++;
}

$key = join('', $buffer);
?>
up
0
Anonymous
11 years ago
Doing a trim($decrypted) will remove the null padding that may occur as a result of decryption.

The problem is if you're encrypting something like a MSWord document which can commonly end with nulls. The result $decrypted will be smaller than the original cleartext - which will then fail to open in MSOffice.

To get around this, make sure you store the length of the original cleartext, and when you decrypt it, do:

$decrypted = substr(mdecrypt_generic($td, $encrypted), 0, $originalLength);
To Top