Maison  >  Article  >  développement back-end  >  Comment PHP utilise le cryptage Mcrypt

Comment PHP utilise le cryptage Mcrypt

醉折花枝作酒筹
醉折花枝作酒筹avant
2021-05-28 17:48:061710parcourir

Cet article vous présentera comment utiliser le cryptage Mcrypt en PHP. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Comment PHP utilise le cryptage Mcrypt

Modules et algorithmes

Mcrypt utilise principalement l'outil Mcrypt pour effectuer des opérations de chiffrement, donc dans CentOS ou d'autres systèmes d'exploitation, nous devons installer libmcrypt-devel pour utiliser cette extension. S'il ne peut pas être installé dans yum, mettez simplement à jour directement la source de yum.

Mcrypt contient de nombreux modules et algorithmes. Il n’est pas nécessaire d’expliquer l’algorithme, c’est la méthode utilisée pour crypter les données. Les modules, notamment CBC, OFB, CFB et ECB, sont une série de modes de regroupement et de cryptage de flux. Il existe des modules recommandés et des modules sécurisés. Pour des distinctions spécifiques, vous pouvez vérifier vous-même les informations pertinentes. aux modules et algorithmes supportés dans notre environnement.

$algorithms = @mcrypt_list_algorithms();
print_r($algorithms);
// Array
// (
//     [0] => cast-128
//     [1] => gost
//     [2] => rijndael-128
//     [3] => twofish
//     [4] => arcfour
//     [5] => cast-256
//     [6] => loki97
//     [7] => rijndael-192
//     [8] => saferplus
//     [9] => wake
//     [10] => blowfish-compat
//     [11] => des
//     [12] => rijndael-256
//     [13] => serpent
//     [14] => xtea
//     [15] => blowfish
//     [16] => enigma
//     [17] => rc2
//     [18] => tripledes
// )

$modes = @mcrypt_list_modes();
print_r($modes);
// Array
// (
//     [0] => cbc
//     [1] => cfb
//     [2] => ctr
//     [3] => ecb
//     [4] => ncfb
//     [5] => nofb
//     [6] => ofb
//     [7] => stream
// )

La fonction mcrypt_list_algorithms() peut obtenir tous les algorithmes Mcrypt pris en charge dans l'environnement actuel. Et mcrypt_list_modes() imprime tous les modules pris en charge dans l'environnement actuel. Notez que dans certaines versions de PHP ou dans certains systèmes, ces contenus seront différents. Lors de l'utilisation des capacités de chiffrement liées à Mcrypt, ces deux éléments sont utilisés conjointement. Par conséquent, il est nécessaire que nous prédéterminions les modules et les algorithmes pris en charge dans l'environnement actuel dans l'environnement dans lequel Mcrypt doit être exécuté.

Crypter et décrypter les données

$key = hash('sha256', 'secret key', true);
$input = json_encode(['id'=>1, 'data'=>'Test mcrypt!']);

$td = @mcrypt_module_open('rijndael-128', '', 'cbc', '');
$iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_URANDOM);
@mcrypt_generic_init($td, $key, $iv);
$encrypted_data = @mcrypt_generic($td, $input);
@mcrypt_generic_deinit($td);
@mcrypt_module_close($td);

echo $encrypted_data, PHP_EOL;
// ��I      $�3���gE�ǣu(�9n�����
//                            p�>P

$td = @mcrypt_module_open('rijndael-128', '', 'cbc', '');

@mcrypt_generic_init($td, $key, $iv);
$data = @mdecrypt_generic($td, $encrypted_data);
echo $data, PHP_EOL;
// {"id":1,"data":"Test mcrypt!"}

@mcrypt_generic_deinit($td);
@mcrypt_module_close($td);

Le code est assez volumineux et désordonné, examinons-le morceau par morceau.

Nous déterminons d’abord une clé de cryptage, puis l’entrée correspond aux données que nous voulons crypter. Par exemple, nous voulons chiffrer des données json. Cette clé peut en fait être une chaîne, mais nous avons également haché la clé ici. Nous avons déjà expliqué en détail le contenu lié au hachage dans l'article précédent.

L'étape suivante consiste à utiliser mcrypt_module_open() pour ouvrir un handle de module de chiffrement. Ici, nous utilisons l'algorithme rijndael-128 et le module cbc. Utilisez ensuite mcrypt_create_iv() pour créer un iv. Ce iv est un vecteur d'initialisation. La valeur du vecteur d'initialisation varie en fonction de l'algorithme cryptographique. L'exigence la plus fondamentale est « l'unicité », ce qui signifie que la même clé ne réutilise pas le même vecteur d'initialisation. Cette fonctionnalité est très importante à la fois dans le chiffrement par bloc et dans le chiffrement par flux. Je pense que si vous avez effectué une communication d'interface liée à WeChat ou Alipay, vous aurez certainement vu cet attribut iv lors du décryptage des données de vérification.

Utilisez mcrypt_generic() pour générer le résultat du chiffrement, utilisez mcrypt_generic_deinit() pour terminer l'initialisation de la génération, et enfin fermez le handle du module de chiffrement avec mcrypt_module_close(). De cette façon, un ensemble de processus de cryptage Mcrypt est terminé.

De même, le processus de décryptage et le processus de cryptage sont similaires, sauf que nous utilisons la fonction mdecrypt_generic() pour décrypter.

Une autre façon de crypter et déchiffrer les données

Le processus de cryptage ci-dessus est très gênant et compliqué. En fait, Mcrypt fournit également une fonction de cryptage plus simple.

$string = 'Test MCrypt2';
$algorithm = 'rijndael-128';
$key = md5( "mypassword", true);
$iv_length = @mcrypt_get_iv_size( $algorithm, MCRYPT_MODE_CBC );
$iv = @mcrypt_create_iv( $iv_length, MCRYPT_RAND );

$encrypted = @mcrypt_encrypt( $algorithm, $key, $string, MCRYPT_MODE_CBC, $iv );
$result = @mcrypt_decrypt( $algorithm, $key, $encrypted, MCRYPT_MODE_CBC, $iv );

echo $encrypted, PHP_EOL; // \<�`�U��Uf)�Y
echo $result, PHP_EOL; // Test MCrypt2

Nous devons encore préparer les données à chiffrer, l'algorithme, la clé et le vecteur iv. Ensuite, utilisez simplement mcrypt_encrypt() et mcrypt_decrypt() directement pour effectuer le cryptage/déchiffrement. N'est-ce pas beaucoup plus pratique ?

Résumé

Comparé à Hash, Mcrypt est une forme de cryptage symétrique déchiffrable. Concernant ce qu'est le cryptage symétrique et asymétrique, nous l'expliquerons en détail dans l'étude des extensions OpenSSL. Le cryptage par hachage est une forme de cryptage unidirectionnel, et les données originales ne peuvent pas être obtenues par calcul inverse des données cryptées. Ils ont tous des scénarios d'application différents, mais comme PHP le demande, Mcrypt n'est plus une extension recommandée, nous avons donc simplement effectué des tests de cryptage/déchiffrement ici. Si cela vous est utile, vous pouvez en apprendre plus en profondeur avec le manuel.

Code de test :

https://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/PHP%E7%9A%84Mcrypt%E5%8A%A0%E5%AF%86%E6%89%A9%E5%B1%95%E7%9F%A5%E8%AF%86%E4%BA%86%E8%A7%A3.php

Apprentissage recommandé : Tutoriel vidéo php

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer