Maison  >  Article  >  développement back-end  >  Explication détaillée de la façon dont PHP utilise mcrypt pour implémenter un exemple de code de cryptage et de déchiffrement

Explication détaillée de la façon dont PHP utilise mcrypt pour implémenter un exemple de code de cryptage et de déchiffrement

伊谢尔伦
伊谢尔伦original
2017-07-08 10:39:241431parcourir

PHP est livré avec un certain nombre de méthodes de cryptage. Nous examinons ici comment utiliser l'extension mcrypt. J'ai également besoin d'utiliser cette chose pour crypter la valeur du cookie de l'utilisateur au travail, et j'ai étudié cet aspect sérieusement.

1. Introduction

Mcrypt est une extension de PHP qui complète l'encapsulation des algorithmes de chiffrement couramment utilisés. En fait, cette extension est une encapsulation de la bibliothèque de classes standard mcrypt. mcrypt a complété un certain nombre d'algorithmes de chiffrement couramment utilisés, tels que DES, TripleDES, Blowfish (par défaut), 3-WAY, SAFER-SK64, SAFER-SK128, TWOFISH. , TEA, RC2 et GOST et propose quatre modèles de chiffrement par blocs : CBC, OFB, CFB et ECB.

2. Installation et utilisation

Pour utiliser cette extension, vous devez d'abord installer la bibliothèque de classes standard mcrypt. Les méthodes de compilation et d'installation de cette extension sont les mêmes que celles des extensions PHP classiques, elles ne seront donc pas expliquées en détail.

3. Quatre modèles de cryptage par blocs

Mcrypt prend en charge quatre modèles de cryptage par blocs, une brève description est la suivante :

① (livre de codes électronique). ) Convient au chiffrement de petites quantités de données aléatoires, telles que le chiffrement des mots de passe de connexion des utilisateurs.

②. MCRYPT_MODE_CBC (chiffrement de blocs de chiffrement) convient aux types de fichiers importants avec un niveau de sécurité de cryptage élevé.

③. MCRYPT_MODE_CFB (retour de chiffrement) convient aux situations où chaque octet du flux de données doit être crypté.

④. MCRYPT_MODE_OFB (retour de sortie, en 8 bits) est compatible avec le mode CFB, mais plus sécurisé que le mode CFB. Le mode CFB entraînera la propagation des erreurs de chiffrement. Si un octet est erroné, tous les octets suivants le seront. Le mode OFB n'a pas ce problème. Cependant, ce mode n’est pas très sûr et n’est pas recommandé.

⑤. MCRYPT_MODE_NOFB (retour de sortie, en nbit) est compatible avec OFB et offre une sécurité plus élevée grâce à l'utilisation d'un algorithme d'opération de bloc.

⑥. MCRYPT_MODE_STREAM est un modèle supplémentaire fourni pour les algorithmes de chiffrement de flux tels que WAKE ou RC4.

NOFB et STREAM ne sont valides que lorsque le numéro de version de mycrypt est supérieur ou égal à libmcrypt-2.4.x. (En gros, tous sont désormais plus grands que cette version, et la dernière version majeure de libmcrypt a atteint 4)

4 Vérifiez les algorithmes et les modèles pris en charge

①. () Liste les modèles pris en charge par l'environnement actuel

mcrypt_list_algorithms() Liste les algorithmes pris en charge par l'environnement actuel

S'il est exécuté depuis la ligne de commande :

Le code est le suivant :

php -r "var_dump(mcrypt_list_modes()); var_dump(mcrypt_list_algorithms());"

pour lister tous les résultats.

5. Comment utiliser

Exemple 1 :

Le code est le suivant :

<?php
$key = "this is a secret key";
$input = "Let us meet at 9 o&#39;clock at the secret place.";
$encrypted_data = mcrypt_ecb (MCRYPT_3DES, $key, $input, MCRYPT_ENCRYPT);
?>

La manière la plus simple est comme dans l'exemple 1 Comme le montre, cette méthode indique que $input est chiffré à l'aide de l'algorithme 3DES et que la clé de chiffrement est $key. Cependant, la méthode d'appel direct n'est plus officiellement recommandée et il est également recommandé de le faire. n’utilisez pas cette méthode en développement. Cela ne signifie pas nécessairement que cette méthode ne fonctionnera plus. Lorsque vous appelez cette méthode sous php5, vous pouvez voir un message d'avertissement, demandant "Avertissement PHP : tentez d'utiliser un IV vide, ce qui n'est PAS recommandé".

L'utilisation officiellement recommandée est présentée dans l'exemple 2

Exemple 2 :

Le code est le suivant :

<?php
    $key = "this is a secret key";
    $input = "Let us meet at 9 o&#39;clock at the secret place.";
    // 打开mcrypt,或者mcrypt类型的资源对象,该对象使用ecb模式,使用3des作为加密算法。
    $td = mcrypt_module_open(&#39;tripledes&#39;, &#39;&#39;, &#39;ecb&#39;, &#39;&#39;);
    // 创建iv(初始化向量)
    $iv = mcrypt_create_iv (
mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    // 根据密钥和iv初始化$td,完成内存分配等初始化工作
    
mcrypt_generic_init($td, $key, $iv);
    // 进行加密
    $encrypted_data = mcrypt_generic($td, $input);
    // 反初始化$td,释放资源
    
mcrypt_generic_deinit($td);
    // 关闭资源对象,退出
     mcrypt_module_close($td);
?>


Le processus ci-dessus termine le processus de cryptage des données. Sélectionnez d'abord l'algorithme de chiffrement et le mode de chiffrement pour créer l'objet ressource et l'IV de mcrypt, puis initialisez le tampon (mémoire) requis pour le chiffrement, libérez le tampon après le chiffrement et enfin fermez l'objet ressource.

Le processus de décryptage est fondamentalement le même que le cryptage. Remplacez simplement mcrypt_generic($td, $input) par mdecrypt_generic($td, $input). Bien entendu, pour un algorithme de chiffrement symétrique comme 3des, les clés utilisées pour le chiffrement et le déchiffrement doivent être exactement les mêmes.

6. À propos de IV

Tous les modèles ne nécessitent pas IV et OFB doivent avoir IV, tandis que CBC et EBC sont facultatifs. Pour le mode IV requis, les valeurs IV de cryptage et de déchiffrement doivent être exactement les mêmes. CBC et EBC n'ont pas cette exigence. Cela peut être identique ou différent, cela n'a pas d'importance.

7. Une classe simple de cryptage et de décryptage

Le code est le suivant :

class AMPCrypt {
    private static function getKey(){
        return md5(&#39;exampleKey&#39;);
     }
    public static function encrypt($value){
         $td = mcrypt_module_open(&#39;tripledes&#39;, &#39;&#39;, &#39;ecb&#39;, &#39;&#39;);
         $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);
         $key = substr(self::getKey(), 0, 
mcrypt_enc_get_key_size($td));
         mcrypt_generic_init($td, $key, $iv);
         $ret = base64_encode(mcrypt_generic($td, $value));
         mcrypt_generic_deinit($td);
         mcrypt_module_close($td);
        return $ret;
     }
    public static function dencrypt($value){
         $td = mcrypt_module_open(&#39;tripledes&#39;, &#39;&#39;, &#39;ecb&#39;, &#39;&#39;);
         $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);
         $key = substr(self::getKey(), 0, mcrypt_enc_get_key_size($td));
         $key = substr(self::getKey(), 0, mcrypt_enc_get_key_size($td));
         mcrypt_generic_init($td, $key, $iv);
         $ret = trim(mdecrypt_generic($td, base64_decode($value))) ;
         mcrypt_generic_deinit($td);
         mcrypt_module_close($td);
        return $ret;
     }
}

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:
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