PHP7.2中AES加密解密方法mcrypt_module_open()替換方案 Function mcrypt_get_block_size() is deprecated


 

直接粘代碼,該類是基於微信公眾號消息加密解密所提供的PHP DEMO改造而來,目前使用於彬彬大學APP接口token校驗中。

php的mcrypt 擴展已經過時了大約10年,並且用起來很復雜。因此它被廢棄並且被 OpenSSL 所取代。 從PHP 7.2起它將被從核心代碼中移除並且移到PECL中。PHP手冊在7.1遷移頁面給出了替代方案,就是用OpenSSL取代MCrypt.

class Aes {
 
    private $hex_iv = '00000000000000000000000000000000'; # converted JAVA byte code in to HEX and placed it here
 
    private $key = '397e2eb61307109f6e68006ebcb62f98'; #Same as in JAVA
 
    function __construct($key) {
        $this->key = $key;
        $this->key = hash('sha256', $this->key, true);
    }
 
    /*
    function encrypt($str) {
        $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
        mcrypt_generic_init($td, $this->key, $this->hexToStr($this->hex_iv));
        $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
        $pad = $block - (strlen($str) % $block);
        $str .= str_repeat(chr($pad), $pad);
        $encrypted = mcrypt_generic($td, $str);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
        return base64_encode($encrypted);
    }
    function decrypt($code) {
        $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
        mcrypt_generic_init($td, $this->key, $this->hexToStr($this->hex_iv));
        $str = mdecrypt_generic($td, base64_decode($code));
        $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
        return $this->strippadding($str);
    }*/
 
    public function encrypt($input)
    {
        $data = openssl_encrypt($input, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->hexToStr($this->hex_iv));
        $data = base64_encode($data);
        return $data;
    }
 
    public function decrypt($input)
    {
        $decrypted = openssl_decrypt(base64_decode($input), 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->hexToStr($this->hex_iv));
        return $decrypted;
    }
 
    /*
      For PKCS7 padding
     */
 
    private function addpadding($string, $blocksize = 16) {
 
        $len = strlen($string);
 
        $pad = $blocksize - ($len % $blocksize);
 
        $string .= str_repeat(chr($pad), $pad);
 
        return $string;
 
    }
 
    private function strippadding($string) {
 
        $slast = ord(substr($string, -1));
 
        $slastc = chr($slast);
 
        $pcheck = substr($string, -$slast);
 
        if (preg_match("/$slastc{" . $slast . "}/", $string)) {
 
            $string = substr($string, 0, strlen($string) - $slast);
 
            return $string;
 
        } else {
 
            return false;
 
        }
 
    }
 
    function hexToStr($hex)
    {
 
        $string='';
 
        for ($i=0; $i < strlen($hex)-1; $i+=2)
 
        {
 
            $string .= chr(hexdec($hex[$i].$hex[$i+1]));
 
        }
 
        return $string;
    }
 
}

 

 

 

 

 

 

 

 

    /**
     * @param array $data
     * 生成每次請求的sign 加密信息
     * @return string
     * Author: yehui
     * Date: 2019/11/19 23:33
     */
        public static function setSign($data = []){
            // 1 按字段排序
            ksort($data);
            // 2 拼接字符串數據 &

            //$data = array('foo'=>'bar', 
            //              'baz'=>'boom',  
            //              'php'=>'hypertext processor'); 
            //echo http_build_query($data); 
            ///* 輸出: 
            //       foo=bar&baz=boom&php=hypertext+processor 
            //*/ 

            $string = http_build_query($data); //http_build_query — 生成 URL-encode 之后的請求字符串
            // 3 通過aes加密
            $aes = new Aes(config('app.aeskey'));
            $string = $aes->encrypt($string);
            // 4 最終返回加密的數據
            return $string;
        }
 
         
public function testAes(){
$data = [
'name'=>'yh',
'age'=>12,
];
$str = '05rIEfJkLlXQpjuUgxFgMw=='; //加密后的數據
//echo IAuth::setSign($data);//05rIEfJkLlXQpjuUgxFgMw== 加密后的數據
$aes = new Aes(config('app.aeskey'));
echo $aes->decrypt('05rIEfJkLlXQpjuUgxFgMw==');//age=12&name=yh 解密后的數據
}
 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM