Maison  >  Article  >  développement back-end  >  Exemple de code de cryptage et de décryptage PHP mcrypt

Exemple de code de cryptage et de décryptage PHP mcrypt

怪我咯
怪我咯original
2017-07-12 15:01:391240parcourir

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, téléchargeable sur http://mcrypt.sourceforge .filet. 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 plus grands que cette version maintenant, la dernière version majeure de libmcrypt a atteint 4)

4. Afficher 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

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

<?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 celle indiquée dans l'exemple 1, cette méthode montre que $ L'entrée est chiffrée à l'aide de l'algorithme 3DES et la clé de chiffrement est $key. Cependant, la méthode d'appel direct n'est plus officiellement recommandée. Il est également recommandé de ne pas utiliser cette méthode en développement. un jour. . Lorsque vous appelez cette méthode sous PHP5, vous verrez un message d'avertissement indiquant "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 :

<?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 du IV crypté et déchiffré 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

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