Heim  >  Artikel  >  Backend-Entwicklung  >  So implementieren Sie die Verschlüsselung und Entschlüsselung in PHP

So implementieren Sie die Verschlüsselung und Entschlüsselung in PHP

藏色散人
藏色散人Original
2020-08-21 10:12:544926Durchsuche

In PHP kann die Mcrypt-Funktionsreihe zum Implementieren der DES-Verschlüsselung und -Entschlüsselung verwendet werden. Die Funktionen in dieser Erweiterung wurden jedoch nach und nach aufgegeben, sodass wir die allgemeine OPENSSL-Methode zum Implementieren der DES-Verschlüsselung und -Entschlüsselung verwenden können.

So implementieren Sie die Verschlüsselung und Entschlüsselung in PHP

Empfohlen: „PHP-Video-Tutorial

Detaillierte Erklärung der DES-Verschlüsselung und -Entschlüsselung in PHP

1. Einführung

DES ist eine häufige Art der symmetrischen Verschlüsselung und ihr vollständiger Name ist Data Encryption Standard. Der Data Encryption Standard ist ein Blockalgorithmus, der Schlüsselverschlüsselung verwendet. Die Schlüssellänge beträgt 64 Bit (Bit) und der Schlüssel, der die Anzahl der Bits überschreitet, wird ignoriert. Die sogenannte symmetrische Verschlüsselung bedeutet, dass die Verschlüsselungs- und Entschlüsselungsschlüssel gleich sind. Bei der symmetrischen Verschlüsselung wird die zu verschlüsselnde Zeichenfolge im Allgemeinen entsprechend einer festen Länge in Blöcke unterteilt, die kleiner als ein ganzer Block ist, oder es gibt ein spezielles Füllzeichen Ende.

Bei der sprachübergreifenden DES-Verschlüsselung und -Entschlüsselung treten häufig Probleme auf, die häufig durch falsche Auffüllmethoden, inkonsistente Codierung oder nicht übereinstimmende Verschlüsselungs- und Entschlüsselungsmodi verursacht werden. Gängige Füllmodi sind: pkcs5, pkcs7, iso10126, ansix923, null. Zu den Verschlüsselungsmodi gehören: DES-ECB, DES-CBC, DES-CTR, DES-OFB und DES-CFB.

Als Softwareentwickler können Sie die DES-Verschlüsselung und -Entschlüsselung mithilfe von Tools testen. Hier wird ein Online-Tool empfohlen: http://tool.chacuo.net/cryptdes

2 Implementierung

PHP stellt die Mcrypt-Serie bereit Funktionen zur Implementierung der DES-Verschlüsselung und -Entschlüsselung, aber die Funktionen in dieser Erweiterung werden nach und nach aufgegeben. Ab PHP 7.2.0 werden sie auf PECL verschoben.

Dieser Code verwendet also die allgemeinere OPENSSL-Methode zur Implementierung der DES-Verschlüsselung und -Entschlüsselung. Der spezifische Implementierungs- und Verwendungscode lautet wie folgt:

<?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);

3. Verwandte Links

DES-Verschlüsselungs- und Entschlüsselungstool: http://tool. chacuo.net /cryptdes

Mcrypt offizielle Dokumentation: http://php.net/manual/zh/book.mcrypt.php

OPENSSL Verschlüsselungs- und Entschlüsselungsfunktion offizielle Dokumentation:

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

openssl_decrypt: http://php.net/manual/zh/function.openssl-decrypt.php

Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Verschlüsselung und Entschlüsselung in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn