Comment implémenter le cryptage et le décryptage en php

藏色散人
Libérer: 2023-03-04 21:50:02
original
4929 Les gens l'ont consulté

En PHP, vous pouvez utiliser la série de fonctions Mcrypt pour implémenter le cryptage et le déchiffrement DES, mais les fonctions de cette extension ont été progressivement abandonnées, nous pouvons donc utiliser la méthode générale OPENSSL pour implémenter le cryptage et le déchiffrement DES.

Comment implémenter le cryptage et le décryptage en php

Recommandé : "Tutoriel vidéo PHP"

Explication détaillée du cryptage et du décryptage DES en PHP

1. Introduction

DES est un type courant de cryptage symétrique. Le nom complet est Data Encryption Standard, qui est une norme de cryptage de données. bloquer chiffré à l’aide d’un algorithme de clé. La longueur de la clé est de 64 bits (bit) et la clé dépassant le nombre de bits est ignorée. Le cryptage dit symétrique signifie que les clés de cryptage et de déchiffrement sont identiques. Le cryptage symétrique divise généralement la chaîne à crypter en blocs selon une longueur fixe, qui est inférieure à un bloc entier ou il y a un caractère de remplissage spécial au niveau du bloc. fin.

Des problèmes surviennent souvent lors du cryptage et du déchiffrement DES dans plusieurs langues, souvent causés par des méthodes de remplissage incorrectes, un encodage incohérent ou des modes de cryptage et de déchiffrement incompatibles. Les modes de remplissage courants sont : pkcs5, pkcs7, iso10126, ansix923, zéro. Les modes de cryptage incluent : DES-ECB, DES-CBC, DES-CTR, DES-OFB et DES-CFB.

En tant que développeur de logiciels, vous pouvez tester le cryptage et le décryptage DES grâce à des outils Voici un outil en ligne recommandé : http://tool.chacuo.net/cryptdes

2. Implémentation

PHP fournit la série de fonctions Mcrypt pour implémenter le cryptage et le déchiffrement DES, mais les fonctions de cette extension ont été progressivement abandonnées et seront déplacées vers PECL à partir de PHP 7.2.0.

Ce code utilise donc la méthode OPENSSL plus générale pour implémenter le cryptage et le déchiffrement DES. Le code d'implémentation et d'utilisation spécifique est le suivant :

<?php
/**
 * openssl 实现的 DES 加密类,支持各种 PHP 版本
 */
class DES
{
    /**
     * @var string $method 加解密方法,可通过 openssl_get_cipher_methods() 获得
     */
    protected $method;
    /**
     * @var string $key 加解密的密钥
     */
    protected $key;
    /**
     * @var string $output 输出格式 无、base64、hex
     */
    protected $output;
    /**
     * @var string $iv 加解密的向量
     */
    protected $iv;
    /**
     * @var string $options
     */
    protected $options;
    // output 的类型
    const OUTPUT_NULL = &#39;&#39;;
    const OUTPUT_BASE64 = &#39;base64&#39;;
    const OUTPUT_HEX = &#39;hex&#39;;
    /**
     * DES constructor.
     * @param string $key
     * @param string $method
     *      ECB DES-ECB、DES-EDE3 (为 ECB 模式时,$iv 为空即可)
     *      CBC DES-CBC、DES-EDE3-CBC、DESX-CBC
     *      CFB DES-CFB8、DES-EDE3-CFB8
     *      CTR
     *      OFB
     *
     * @param string $output
     *      base64、hex
     *
     * @param string $iv
     * @param int $options
     */
    public function __construct($key, $method = &#39;DES-ECB&#39;, $output = &#39;&#39;, $iv = &#39;&#39;, $options = OPENSSL_RAW_DATA | OPENSSL_NO_PADDING)
    {
        $this->key = $key;
        $this->method = $method;
        $this->output = $output;
        $this->iv = $iv;
        $this->options = $options;
    }
    /**
     * 加密
     *
     * @param $str
     * @return string
     */
    public function encrypt($str)
    {
        $str = $this->pkcsPadding($str, 8);
        $sign = openssl_encrypt($str, $this->method, $this->key, $this->options, $this->iv);
        if ($this->output == self::OUTPUT_BASE64) {
            $sign = base64_encode($sign);
        } else if ($this->output == self::OUTPUT_HEX) {
            $sign = bin2hex($sign);
        }
        return $sign;
    }
    /**
     * 解密
     *
     * @param $encrypted
     * @return string
     */
    public function decrypt($encrypted)
    {
        if ($this->output == self::OUTPUT_BASE64) {
            $encrypted = base64_decode($encrypted);
        } else if ($this->output == self::OUTPUT_HEX) {
            $encrypted = hex2bin($encrypted);
        }
        $sign = @openssl_decrypt($encrypted, $this->method, $this->key, $this->options, $this->iv);
        $sign = $this->unPkcsPadding($sign);
        $sign = rtrim($sign);
        return $sign;
    }
    /**
     * 填充
     *
     * @param $str
     * @param $blocksize
     * @return string
     */
    private function pkcsPadding($str, $blocksize)
    {
        $pad = $blocksize - (strlen($str) % $blocksize);
        return $str . str_repeat(chr($pad), $pad);
    }
    /**
     * 去填充
     * 
     * @param $str
     * @return string
     */
    private function unPkcsPadding($str)
    {
        $pad = ord($str{strlen($str) - 1});
        if ($pad > strlen($str)) {
            return false;
        }
        return substr($str, 0, -1 * $pad);
    }
}
$key = &#39;key123456&#39;;
$iv = &#39;iv123456&#39;;
// DES CBC 加解密
$des = new DES($key, &#39;DES-CBC&#39;, DES::OUTPUT_BASE64, $iv);
echo $base64Sign = $des->encrypt(&#39;Hello DES CBC&#39;);
echo "\n";
echo $des->decrypt($base64Sign);
echo "\n";
// DES ECB 加解密
$des = new DES($key, &#39;DES-ECB&#39;, DES::OUTPUT_HEX);
echo $base64Sign = $des->encrypt(&#39;Hello DES ECB&#39;);
echo "\n";
echo $des->decrypt($base64Sign);
Copier après la connexion

Liens connexes

<.> Outil de cryptage et décryptage DES : http://tool.chacuo.net/cryptdes

Document officiel Mcrypt : http://php.net/manual/zh/book.mcrypt.php

OPENSSL Documentation officielle des fonctions de chiffrement et de décryptage :

openssl_encrypt : http://php.net/manual/zh/function.openssl-encrypt.php

openssl_decrypt : http:// php.net/manual /zh/function.openssl-decrypt.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:
source:php.cn
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