>  기사  >  백엔드 개발  >  PHP에서 des 암호화 및 암호 해독을 구현하는 방법

PHP에서 des 암호화 및 암호 해독을 구현하는 방법

藏色散人
藏色散人원래의
2020-08-21 10:12:544925검색

PHP에서는 Mcrypt 일련의 함수를 사용하여 DES 암호화 및 복호화를 구현할 수 있지만 이 확장의 기능은 점차 폐기되었으므로 일반적인 OPENSSL 방법을 사용하여 DES 암호화 및 복호화를 구현할 수 있습니다.

PHP에서 des 암호화 및 암호 해독을 구현하는 방법

추천: "PHP 비디오 튜토리얼"

PHP의 DES 암호화 및 복호화에 대한 자세한 설명

1. 소개

DES는 대칭 암호화의 일반적인 유형이며, 전체 이름은 데이터 암호화 표준은 키 암호화를 사용하는 블록 알고리즘입니다. 키 길이는 64비트(bit)이며, 비트수를 초과하는 키는 무시됩니다. 소위 대칭 암호화는 암호화 키와 복호화 키가 동일한 것을 의미합니다. 대칭 암호화는 일반적으로 암호화할 문자열을 전체 블록보다 작은 블록으로 나누거나 특수 패딩 문자가 있는 경우를 말합니다. 끝.

언어 간 DES 암호화 및 암호 해독을 수행할 때 문제가 자주 발생합니다. 이는 잘못된 패딩 방법, 일관되지 않은 인코딩 또는 일치하지 않는 암호화 및 암호 해독 모드로 인해 발생하는 경우가 많습니다. 일반적인 채우기 모드는 pkcs5, pkcs7, iso10126, ansix923, zero입니다. 암호화 모드에는 DES-ECB, DES-CBC, DES-CTR, DES-OFB 및 DES-CFB가 포함됩니다.

소프트웨어 개발자로서 도구를 통해 DES 암호화 및 암호 해독을 테스트할 수 있습니다. 다음은 권장되는 온라인 도구입니다. http://tool.chacuo.net/cryptdes

2. 구현

PHP는 Mcrypt 시리즈를 제공합니다. DES 암호화 및 복호화 구현을 위한 기능이 있지만 이 확장 기능은 PHP 7.2.0부터 점차 폐기되고 있으며 PECL로 이동됩니다.

따라서 이 코드는 보다 일반적인 OPENSSL 방법을 사용하여 DES 암호화 및 암호 해독을 구현합니다. 구체적인 구현 및 사용 코드는 다음과 같습니다.

<?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. 관련 링크

DES 암호화 및 암호 해독 도구: http://tool. chacuo.net /cryptdes

Mcrypt 공식 문서: http://php.net/manual/zh/book.mcrypt.php

OPENSSL 암호화 및 복호화 기능 공식 문서:

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

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

위 내용은 PHP에서 des 암호화 및 암호 해독을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.