Maison > développement back-end > Problème PHP > Comment PHP utilise le cryptage Mcrypt

Comment PHP utilise le cryptage Mcrypt

醉折花枝作酒筹
Libérer: 2023-03-10 06:58:02
avant
1739 Les gens l'ont consulté

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
// )
Copier après la connexion

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);
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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!

Étiquettes associées:
php
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal