From 75049c81dc6aa9d2ca257c7b5c6b6f3f95af6c09 Mon Sep 17 00:00:00 2001 From: Gavin Foo Date: Wed, 30 Aug 2017 16:33:34 +0800 Subject: [PATCH] FIX "Function mcrypt_module_open() is deprecated in PHP 7.1" --- wechat.class.php | 136 +++++++++++++++++++---------------------------- 1 file changed, 55 insertions(+), 81 deletions(-) diff --git a/wechat.class.php b/wechat.class.php index b8b3644..6494e14 100755 --- a/wechat.class.php +++ b/wechat.class.php @@ -4645,89 +4645,63 @@ function Prpcrypt($k) $this->key = base64_decode($k . "="); } - /** - * 对明文进行加密 - * @param string $text 需要加密的明文 - * @return string 加密后的密文 - */ - public function encrypt($text, $appid) - { - - try { - //获得16位随机字符串,填充到明文之前 - $random = $this->getRandomStr();//"aaaabbbbccccdddd"; - $text = $random . pack("N", strlen($text)) . $text . $appid; - // 网络字节序 - $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); - $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); - $iv = substr($this->key, 0, 16); - //使用自定义的填充方式对明文进行补位填充 - $pkc_encoder = new PKCS7Encoder; - $text = $pkc_encoder->encode($text); - mcrypt_generic_init($module, $this->key, $iv); - //加密 - $encrypted = mcrypt_generic($module, $text); - mcrypt_generic_deinit($module); - mcrypt_module_close($module); - - // print(base64_encode($encrypted)); - //使用BASE64对加密后的字符串进行编码 - return array(ErrorCode::$OK, base64_encode($encrypted)); - } catch (Exception $e) { - //print $e; - return array(ErrorCode::$EncryptAESError, null); - } + /** + * 对明文进行加密 + * @param string $text 需要加密的明文 + * @return string 加密后的密文 + */ + public function encrypt($text, $appid){ + try { + //获得16位随机字符串,填充到明文之前 + $random = $this->getRandomStr(); + $text = $random . pack("N", strlen($text)) . $text . $appid; + $iv = substr($this->key, 0, 16); + $pkc_encoder = new PKCS7Encoder; + $text = $pkc_encoder->encode($text); + $encrypted = openssl_encrypt($text,'AES-256-CBC',substr($this->key, 0, 32),OPENSSL_ZERO_PADDING,$iv); + return array(ErrorCode::$OK, $encrypted); + } catch (Exception $e) { + //print $e; + return array(ErrorCode::$EncryptAESError, null); } - - /** - * 对密文进行解密 - * @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); - if (!$appid) - $appid = $from_appid; - //如果传入的appid是空的,则认为是订阅号,使用数据中提取出来的appid - } catch (Exception $e) { - //print $e; - return array(ErrorCode::$IllegalBuffer, null); - } - if ($from_appid != $appid) - return array(ErrorCode::$ValidateAppidError, null); - //不注释上边两行,避免传入appid是错误的情况 - return array(0, $xml_content, $from_appid); //增加appid,为了解决后面加密回复消息的时候没有appid的订阅号会无法回复 - + } + /** + * 对密文进行解密 + * @param string $encrypted 需要解密的密文 + * @return string 解密得到的明文 + */ + public function decrypt($encrypted, $appid){ + try { + $iv = substr($this->key, 0, 16); + $decrypted = openssl_decrypt($encrypted,'AES-256-CBC',substr($this->key, 0, 32),OPENSSL_ZERO_PADDING,$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); + if (!$appid) + $appid = $from_appid; + //如果传入的appid是空的,则认为是订阅号,使用数据中提取出来的appid + } catch (Exception $e) { + //print $e; + return array(ErrorCode::$IllegalBuffer, null); + } + if ($from_appid != $appid) + return array(ErrorCode::$ValidateAppidError, null); + //不注释上边两行,避免传入appid是错误的情况 + return array(0, $xml_content, $from_appid); + //增加appid,为了解决后面加密回复消息的时候没有appid的订阅号会无法回复 + } /** * 随机生成16位字符串