Maison  >  Article  >  développement back-end  >  Posture d'utilisation correcte du chiffrement et du décryptage DES en php

Posture d'utilisation correcte du chiffrement et du décryptage DES en php

藏色散人
藏色散人avant
2020-01-16 14:21:362836parcourir

Avant-propos : Dans le développement quotidien, nous chiffrons souvent les caractères clés, soit pour des raisons de sécurité, soit pour des raisons de standardisation. Aujourd'hui, nous allons découvrir l'utilisation correcte du cryptage DES

Organigramme des tâches

Posture dutilisation correcte du chiffrement et du décryptage DES en php

Fragment 1

Faites-le, j'ai commencé à écrire le code de cryptage comme suit

class DES
{
    var $key;
    var $iv; //偏移量
 
    function DES( $key, $iv=0 ) {
        //key长度8例如:1234abcd
        $this->key = $key;
        if( $iv == 0 ) {
            $this->iv = $key;
        } else {
            $this->iv = $iv; //mcrypt_create_iv ( mcrypt_get_block_size (MCRYPT_DES, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM );
        }
    }
 
    function encrypt($str) {
        //加密,返回大写十六进制字符串
        $size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MODE_CBC );
        $str = $this->pkcs5Pad ( $str, $size );
        return strtoupper( bin2hex( mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->iv ) ) );
    }
 
    function decrypt($str) {
        //解密
        $strBin = $this->hex2bin( strtolower( $str ) );
        $str = mcrypt_cbc( MCRYPT_DES, $this->key, $strBin, MCRYPT_DECRYPT, $this->iv );
        $str = $this->pkcs5Unpad( $str );
        return $str;
    }
 
    function hex2bin($hexData) {
        $binData = "";
        for($i = 0; $i < strlen ( $hexData ); $i += 2) {
            $binData .= chr ( hexdec ( substr ( $hexData, $i, 2 ) ) );
        }
        return $binData;
    }
 
    function pkcs5Pad($text, $blocksize) {
        $pad = $blocksize - (strlen ( $text ) % $blocksize);
        return $text . str_repeat ( chr ( $pad ), $pad );
    }
 
    function pkcs5Unpad($text) {
        $pad = ord ( $text {strlen ( $text ) - 1} );
        if ($pad > strlen ( $text ))
            return false;
        if (strspn ( $text, chr ( $pad ), strlen ( $text ) - $pad ) != $pad)
            return false;
        return substr ( $text, 0, - 1 * $pad );
    }
}

Code de test

<?php
header("Content-type: text/html; charset=utf-8");
error_reporting(0);
require "DES5.php";
// 秘钥
$key = &#39;MOxinrui&#39;;
$crypt = new DES5($key);
$str = &#39;podsmia&#39;;
echo "原字符是".$str.&#39;<br>&#39;;
$encrypt_str = $crypt->encrypt($str);
echo "加密后的字符是".$encrypt_str.&#39;<br>&#39;;
$decrypt_str= $crypt->decrypt($encrypt_str);
echo "解密后的字符是".$decrypt_str.&#39;<br>&#39;;

Effet

原字符是podsmia
加密后的字符是9490E64136137FD8
解密后的字符是podsmia

Après quelques jours, je n'avais plus rien à faire, continuez exécutez le code

Obsolète : les méthodes portant le même nom que leur classe ne seront pas des constructeurs dans une future version de PHP ; DES5 a un constructeur obsolète dans D:phpstudy_proWWWdesDES5.php à la ligne 2

Le caractère original est podsmia

Erreur fatale : Erreur non détectée : Appel à la fonction non définie mcrypt_get_block_size() dans D:phpstudy_proWWWdesDES5.php:19 Trace de pile : #0 D:phpstudy_proWWWdes1 . php(10): DES5->encrypt('podsmia') #1 {main} lancé dans D:phpstudy_proWWWdesDES5.php à la ligne 19

m'a signalé une erreur fatale. ne bouge rien. Que se passe-t-il? Après quelques recherches plus tard. Il a été constaté qu'il s'agissait d'un problème avec la version php. Je l'ai exécuté avec succès auparavant parce que j'utilisais php5.5, mais cette fois j'ai eu une erreur et j'utilisais php7.2. Ensuite, je dois trouver une alternative. . Ensuite, regardez-moi opérer

Fragment 2

<?php
class DES7
{
    //要改的加密
    public function desEncrypt($str,$key) {
        $iv = $key;
        $data = openssl_encrypt($str,"DES-CBC",$key,OPENSSL_RAW_DATA,$iv);
        $data = strtolower(bin2hex($data));
        return $data;
    }
 
    //要改的解密
    public function desDecrypt($str,$key) {
        $iv = $key;
        return openssl_decrypt (hex2bin($str), &#39;DES-CBC&#39;, $key, OPENSSL_RAW_DATA,$iv);
    }
}

Code de test

<?php
header("Content-type: text/html; charset=utf-8");
//error_reporting(0);
// 秘钥
require "DES7.php";
$key = &#39;MOxinrui&#39;;
$crypt = new DES7($key);
$str = &#39;问哪个&#39;;
echo "原字符是".$str.&#39;<br>&#39;;
$encrypt_str = $crypt->desEncrypt($str,$key);
echo "加密后的字符是".$encrypt_str.&#39;<br>&#39;;
$decrypt_str= $crypt->desDecrypt($encrypt_str,$key);
echo "解密后的字符是".$decrypt_str.&#39;<br>&#39;;

Effet

原字符是问哪个
加密后的字符是074b8beee21eefca7ec3a60cb8edda18
解密后的字符是问哪个

Problème parfaitement résolu. Si vous rencontrez ce genre de problème à l'avenir, vous pouvez simplement copier mon code, ce qui est pratique et sans problème.

Pour plus de connaissances sur PHP, veuillez visiter le

Tutoriel 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