Maison > développement back-end > tutoriel php > 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

藏色散人
Libérer: 2023-04-08 08:36:01
avant
2873 Les gens l'ont consulté

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

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

Effet

原字符是podsmia
加密后的字符是9490E64136137FD8
解密后的字符是podsmia
Copier après la connexion

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

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

Effet

原字符是问哪个
加密后的字符是074b8beee21eefca7ec3a60cb8edda18
解密后的字符是问哪个
Copier après la connexion

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!

Étiquettes associées:
php
source:csdn.net
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