收藏
回答

小程序-订阅消息回调-php解析失败?

php 版本 7.4

由于官方提供的 mcrypt 在7.4被移除了,自己更改了 代码,但是解析失败了,求大佬指正

我的代码:

public function decrypt($encrypted, $appid)
{
    try {
        $ciphertext_dec = base64_decode($encrypted);
        $iv = substr($this->key, 0, 16);
        $decrypted = openssl_decrypt($ciphertext_dec, 'AES-128-CBC', $this->key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv);
    } catch (Exception $e) {
        return array(ErrorCode::$DecryptAESError, null);
    }

    try {
        $pkc_encoder = new PKCS7Encoder;
        $result = $pkc_encoder->decode($decrypted);
        if (strlen($result) < 16) return "";
        $content = substr($result, 16);
        $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 array(ErrorCode::$IllegalBuffer, null);
    }
    if ($from_appid != $appid) return array(ErrorCode::$ValidateAppidError, null);
    return array(0, $xml_content);
}


官方原来的代码:

    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);


    }



回答关注问题邀请回答
收藏

1 个回答

  • 何涛
    何涛
    2024-12-04

    AES-128-CBC 换成 AES-256-CBC

    2024-12-04
    有用 1
    回复 1
    • 黑暗骑士
      黑暗骑士
      2024-12-04
      你太牛逼了,是的,我哭了,谢谢老哥
      2024-12-04
      回复
登录 后发表内容