zoukankan      html  css  js  c++  java
  • 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 解密后的数据
    }
     

     

  • 相关阅读:
    marquee基本语法和marquee的相关参数设置
    [转]FreeTextBox使用详解
    div+css三级下拉菜单无限制下拉
    让Flash在Firefox和IE下背景透明
    asp.net制作幻灯片
    图片连续滚动代码,左右连续,上下连续不间断滚动
    纯DIV+CSS下拉菜单
    连续滚动图片代码
    sql语句修改access中的字段类型,access数据类型大全!
    非常棒的图片连续滚动代码
  • 原文地址:https://www.cnblogs.com/yehuisir/p/11893482.html
Copyright © 2011-2022 走看看