• 【PHP】微信开放平台---消息加解密-php7.1 使用openssl代替Mcrypt


    1、问题

    微信开发小程序消息加解密,官方给出的dome中使用正常,最近升级了7.1发现接收消息不能解密了,最后查了日志又查了各种资料发现 Mcrypt 函数php7.1已经被废弃; 

    2、解决方式

    Prpcrypt类中使用openssl代替Mcrypt

    官方代码:

    /**
         * 对密文进行解密
         * @param string $encrypted 需要解密的密文
         * @return string 解密得到的明文
         */
        public function decrypt($encrypted, $appid)
        {
    
            try {
                //使用BASE64对需要解密的字符串进行解码
                $ciphertext_dec = base64_decode($encrypted);
                $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
                $iv = substr($this->key, 0, 16);
                mcrypt_generic_init($module, $this->key, $iv);
    
                //解密
                $decrypted = mdecrypt_generic($module, $ciphertext_dec);
                mcrypt_generic_deinit($module);
                mcrypt_module_close($module);
            } catch (Exception $e) {
                return array(ErrorCode::$DecryptAESError, null);
            }
    
    
            try {
                //去除补位字符
                $pkc_encoder = new PKCS7Encoder;
                $result = $pkc_encoder->decode($decrypted);
                //去除16位随机字符串,网络字节序和AppId
                if (strlen($result) < 16)
                    return "";
                $content = substr($result, 16, strlen($result));
                $len_list = unpack("N", substr($content, 0, 4));
                $xml_len = $len_list[1];
                $xml_content = substr($content, 4, $xml_len);
                $from_appid = substr($content, $xml_len + 4);
            } catch (Exception $e) {
                //print $e;
                return array(ErrorCode::$IllegalBuffer, null);
            }
            if ($from_appid != $appid)
                return array(ErrorCode::$ValidateAppidError, null);
            return array(0, $xml_content);
    
        }

    修改之后代码:

    /**
         * 对密文进行解密
         * @param string $encrypted 需要解密的密文
         * @return string 解密得到的明文
         */
        public function decrypt($encrypted, $appid)
        {
    
            try {
                $iv = substr($this->key, 0, 16);
                $decrypted = openssl_decrypt(base64_decode($encrypted),'AES-256-CBC',$this->key,OPENSSL_RAW_DATA,$iv);
               
            } catch (Exception $e) {
                return array(ErrorCode::$DecryptAESError, null);
            }
            try {
                //去除补位字符
                $pkc_encoder = new PKCS7Encoder;
                $result = $pkc_encoder->decode($decrypted);
                //去除16位随机字符串,网络字节序和AppId
                if (strlen($result) < 16)
                    return "";
                $content = substr($result, 16, strlen($result));
                $len_list = unpack("N", substr($content, 0, 4));
                $xml_len = $len_list[1];
                $xml_content = substr($content, 4, $xml_len);
                $from_appid = substr($content, $xml_len + 4);
             
            } catch (Exception $e) {
                //print $e;
                return array(ErrorCode::$IllegalBuffer, null);
            }
            if ($from_appid != $appid)
                return array(ErrorCode::$ValidateAppidError, null);
            return array(0, $xml_content);
    
        }
  • 相关阅读:
    VC开发,引用win8.1配置
    RabbitMQ——常见的函数介绍
    OpenLayer4——面(多边形)
    OpenLayer4——图形组合
    OpenLayer4——GeoJSON简介
    RabbitMQ——交换机
    RabbitMQ——helloworld
    OpenLayer4——添加Geojson
    RabbitMQ——消息头
    OpenLayer4——圆形
  • 原文地址:https://www.cnblogs.com/afsj/p/7424121.html
Copyright © 2020-2023  润新知