>  기사  >  백엔드 개발  >  데이터 암호화 및 복호화

데이터 암호화 및 복호화

一朵云彩
一朵云彩원래의
2020-05-06 17:55:5791검색

PHP 버전 업그레이드로 인해 암호화 및 복호화 기능 등 일부 기능이 사라졌습니다. PHP7.1 이전에는 mcrypt_decrypt() 및 mcrypt_encrypt()를 통해 복호화 및 암호화가 구현되었으며, PHP7.1 이후에는 openssl_decrypt() 및 암호화를 통해 구현되었습니다. openssl_encrypt() 복호화 및 암호화를 구현합니다. 여기서는 encapsulation 클래스를 통해 두 가지 구현 방법이 구현됩니다.

암호화 및 복호화 단계의 두 가지 방법:

복호화 시 원본 데이터가 반환됩니다(배열--> 암호화--> 암호화된 문자열--> ;암호화-->원본 배열|| JSON 문자열-->암호화-->암호화된 문자열-->암호화-->원래 JSON 문자열-->암호화--> ->복호화됨 -->원본 문자열)

PHP7.1 이하는

클래스 메소드

를 사용합니다. 이 클래스에서 주목해야 할 것은 키입니다: 알고리즘에 해당하는 키 길이: AES -128, 192, 256 암호화 키 길이는 각각 16, 24, 32비트입니다

<?php
namespace aes;
class AesT
{
    private $_bit = MCRYPT_RIJNDAEL_256;
    private $_type = MCRYPT_MODE_CBC;
    private $_key = &#39;ThisIsYourAesKey&#39;; // 密钥 必须16位 24位  32位
    private $_use_base64 = true;
    private $_iv_size = null;
    private $_iv = null;

    /**
     * @param string $_key 密钥
     * @param int $_bit 默认使用128字节  支持256、192、128
     * @param string $_type 加密解密方式  默认为ecb 支持cfb、cbc、nofb、ofb、stream、ecb
     * @param boolean $_use_base64 默认使用base64二次加密
     */
    public function __construct($_key = &#39;&#39;, $_bit = 128, $_type = &#39;ecb&#39;, $_use_base64 = true)
    {
        // 加密字节
        if (192 === $_bit) {
            $this->_bit = MCRYPT_RIJNDAEL_192;
        } elseif (128 === $_bit) {
            $this->_bit = MCRYPT_RIJNDAEL_128;
        } else {
            $this->_bit = MCRYPT_RIJNDAEL_256;
        }
        // 加密方法
        if (&#39;cfb&#39; === $_type) {
            $this->_type = MCRYPT_MODE_CFB;
        } elseif (&#39;cbc&#39; === $_type) {
            $this->_type = MCRYPT_MODE_CBC;
        } elseif (&#39;nofb&#39; === $_type) {
            $this->_type = MCRYPT_MODE_NOFB;
        } elseif (&#39;ofb&#39; === $_type) {
            $this->_type = MCRYPT_MODE_OFB;
        } elseif (&#39;stream&#39; === $_type) {
            $this->_type = MCRYPT_MODE_STREAM;
        } else {
            $this->_type = MCRYPT_MODE_ECB;
        }
        // 密钥
        if (!empty($_key)) {
            $this->_key = $_key;
        }
        // 是否使用base64
        $this->_use_base64 = $_use_base64;

        $this->_iv_size = mcrypt_get_iv_size($this->_bit, $this->_type);
        $this->_iv = mcrypt_create_iv($this->_iv_size, MCRYPT_RAND);
    }

    /**
     * 加密
     * @param string $string 待加密字符串
     * @return string
     */
    public function encode($string)
    {
        //
        if (MCRYPT_MODE_ECB === $this->_type) {
            $encodeString = mcrypt_encrypt($this->_bit, $this->_key, json_encode($string), $this->_type);
        } else {
            $encodeString = mcrypt_encrypt($this->_bit, $this->_key, json_encode($string), $this->_type, $this->_iv);
        }
        if ($this->_use_base64) {
            $encodeString = base64_encode($encodeString);
        }
        return $encodeString;
    }

    /**
     * 解密
     * @param string $string 待解密字符串
     * @return string
     */
    public function decode($string)
    {
        if ($this->_use_base64) {
            $string = base64_decode($string);
        }
        if (MCRYPT_MODE_ECB === $this->_type) {
            $decodeString = mcrypt_decrypt($this->_bit, $this->_key, $string, $this->_type);
        } else {
            $decodeString = mcrypt_decrypt($this->_bit, $this->_key, $string, $this->_type, $this->_iv);
        }
      return $decodeString;
    }
}

사용

<?php
use aes\AesT;
class Test{
	public function index()
    {
        $data1 = [&#39;status&#39; => &#39;1&#39;, &#39;info&#39; => &#39;success&#39;, &#39;data&#39; => [[&#39;id&#39; => 1, &#39;name&#39; => &#39;大房间&#39;, &#39;2&#39; => &#39;小房间&#39;]]];
        //$data2 = &#39;{"status":"1","info":"success","data":[{"id":1,"name":"\u5927\u623f\u95f4","2":"\u5c0f\u623f\u95f4"}]}&#39;;
        //$data3 = &#39;PHP AES cbc模式 pkcs7 128加密解密&#39;;
        $objT = new AesT();
        $resT = $objT->encode($data1);//加密数据
        var_dump($resT);
        var_dump($objT->decode($resT));//解密
    }
}

PHP7.1 이상 사용

클래스 메서드

AES-128-CBC, AES-192-CBC 및 AES-256-CBC의 암호화 키 길이는 각각 16, 24, 32비트입니다.


openssl _암호화 ()의 네 가지 매개변수 중 네 번째 매개변수에 주의해야 합니다.

0: 일반 텍스트를 자동으로 패딩하고 반환된 데이터는 base64로 인코딩됩니다.

1: OPENSSL_RAW_DATA, 일반 텍스트를 자동으로 패딩합니다. text, 그러나 반환된 결과는 base64로 인코딩되지 않았습니다.

2 : OPENSSL_ZERO_PADDING, 自动对明文进行 0 填充, 返回的结果经过 base64 编码

<?php

namespace aes;

class Aes
{
    public static $key = &#39;&#39;;
    public static $iv = &#39;&#39;;
    public static $method = &#39;&#39;;

    public function __construct()
    {
        //加密key
        self::$key = md5(&#39;AeSNJkBfhHmJqLzHL&#39;, true);
        //保证偏移量为16位
        self::$iv = md5(&#39;HfgUdCliBjKjuRfa&#39;, true);
        //加密方式  # AES-128-CBC AES-192-CBC AES-256-CBC
        self::$method = &#39;AES-128-CBC&#39;;
    }

    /**
     * @desc 加密
     * @param $data
     * @return false|string
     */
    public function aesEn($data)
    {
        return base64_encode(openssl_encrypt(json_encode($data), self::$method, self::$key, OPENSSL_RAW_DATA, self::$iv));
    }

    /**
     * @desc 解密
     * @param $data
     * @return false|string
     */
    public function aesDe($data)
    {
        $tmpData = openssl_decrypt(base64_decode($data), self::$method, self::$key, OPENSSL_RAW_DATA, self::$iv);
        return is_null(json_decode($tmpData)) ? $tmpData : json_decode($tmpData, true);
    }
}

使用

<?php

use aes\Aes;

class Test
{
    public function aes()
    {
        $obj = new Aes();
		
        $data = [&#39;status&#39; => &#39;1&#39;, &#39;info&#39; => &#39;success&#39;, &#39;data&#39; => [[&#39;id&#39; => 1, &#39;name&#39; => &#39;大房间&#39;, &#39;2&#39; => &#39;小房间&#39;]]];
        //$data = &#39;{"status":"1","info":"success","data":[{"id":1,"name":"\u5927\u623f\u95f4","2":"\u5c0f\u623f\u95f4"}]}&#39;;
        //$data = &#39;PHP AES cbc模式 pkcs7 128加密解密&#39;;
        $res = $obj->aesEn($data);//加密数据
        var_dump($res);
        var_dump($obj->aesDe($res));//解密
    }
}


使用该加密解密类时,如果将两个类整合到一个类中,需要通过PHP_VERSION获取当前PHP版本

위 내용은 데이터 암호화 및 복호화의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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