php7.1微信公众平台消息安全模式的加密及解密

php7.1发布后新特性吸引了不少PHPer,大家都在讨论新特性带来的好处与便利。但是从php7.0 升级到 php7.1 废弃(过时)了一个在过去普遍应用的扩展(mcrypt扩展)。官方提供了相应的解决提示,却没有提供更详细的解决办法。于是坑来了…. --- 引用自http://blog.csdn.net/sapperlab/article/details/56672443

坑真的来了。。。。

openssl_encrypt 加密相当于将 mcrypt_encrypt 的加密结果执行一次 base64_encode 
openssl_decode 解密相当于 先将加密结果执行一次base64_decode 然后再通过mcrypt_encrypt 解密


这两个方法真的有对加密结果有做相应的base64处理么?不见得吧。。。


下面贴代码,mcrypt就不贴了,微信有给出官方的demo,下面贴一下真实环境下可以实现通信的代码,别问我管不管用,至少本人的调通了。。 同样 欢迎各路神仙来拍砖,指正。。。更希望用上面方式走通的朋友留言指点一下,不胜感激


其实本人最终是卡在了加密这块,解密没啥可说的


加密这里通过一步一步的拆解调试,最终发现openssl_encrypt加密结果比官方给的mcrypt_generic加密结果多了16位。。

同样需要对加密结果进行一次base64!!!!

 /**
     * 对明文进行加密
     * @param string $text 需要加密的明文
     * @return string 加密后的密文
     */
    public function encrypt($text, $appid)
    {

        try {
            //获得16位随机字符串,填充到明文之前
            $random = $this->getRandomStr();
            $text = $random . pack("N", strlen($text)) . $text . $appid;
            //使用自定义的填充方式对明文进行补位填充
            $pkc_encoder = new PKCS7Encoder();
            $text = $pkc_encoder->encode($text);

            $iv = substr($this->key, 0, 16);
            $encrypted = openssl_encrypt($text, 'aes-256-cbc', $this->key, OPENSSL_RAW_DATA, $iv);
            $encrypted = substr($encrypted,0,strlen($encrypted)-16);

            //print(base64_encode($encrypted));
            //使用BASE64对加密后的字符串进行编码
            return ['errcode' => 0, 'encrypt' => base64_encode($encrypted)];
        } catch (Exception $e) {
            return ErrorCode::$EncryptAESError;
        }
    }


这是解密,没啥可说的,相应的替换官方给的demo就行: 但是,我想说解密之前还真得进行base64_decode(),别跟我说openssl_decrypt()会对加密结果进行base64_decode!!!至少我没验证通过。。。或许大神们可以

/**
     * 对密文进行解密
     * @param string $encrypted 需要解密的密文
     * @return string 解密得到的明文
     */
    public function decrypt($encrypted, $appid)
    {
        try {
            //使用BASE64对需要解密的字符串进行解码
            $iv = substr($this->key, 0, 16);
            $ciphertext_dec = base64_decode($encrypted);
            $decrypted = openssl_decrypt($ciphertext_dec, 'aes-256-cbc', $this->key, OPENSSL_RAW_DATA, $iv);
        } catch (Exception $e) {
            return ErrorCode::$DecryptAESError;
        }

        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) {
            return ErrorCode::$IllegalBuffer;
        }
        if ($from_appid != $appid) {
            return ErrorCode::$ValidateAppidError;
        }
        return ['errcode' => 0, 'decrypt' => $xml_content];

    }




你可能感兴趣的:(默认)