Table des matières
thinkphp微信开发:安全模式消息加解密,thinkphp解密
解决方法:
Maison php教程 php手册 thinkphp微信开发:安全模式消息加解密,thinkphp解密

thinkphp微信开发:安全模式消息加解密,thinkphp解密

Jun 13, 2016 am 08:50 AM
thinkphp 使用 ajouter 安全 开发 微信 模式 消息 解密

thinkphp微信开发:安全模式消息加解密,thinkphp解密

       使用thinkphp官方的WeChat包,使用不同模式可以成功,但是安全模式就是不行,现将分析解决结果做下记录。

 

                                                                                                                                                                                                                  TRight

分析问题:

          解密微信服务器消息老是不成功,下载下微信公众平台官方给出的解密文件和WechatCrypt.class.php进行比对发现也没有问题。用file_put_contents函数保存下解密后的文件进行分析。发现官方包解密的xml不是标准的xml格式,所以simplexml_load_string函数无法处理。

<span>/*</span><span>*
     * 对密文进行解密
     * @param  string $encrypt 密文
     * @return string          明文
     </span><span>*/</span>
    <span>public</span> <span>function</span> decrypt(<span>$encrypt</span><span>){
        </span><span>//</span><span>BASE64解码</span>
        <span>$encrypt</span> = <span>base64_decode</span>(<span>$encrypt</span><span>);

        </span><span>//</span><span>打开加密算法模块</span>
        <span>$td</span> = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''<span>);

        </span><span>//</span><span>初始化加密算法模块</span>
        mcrypt_generic_init(<span>$td</span>, <span>$this</span>->cyptKey, <span>substr</span>(<span>$this</span>->cyptKey, 0, 16<span>));

        </span><span>//</span><span>执行解密</span>
        <span>$decrypt</span> = mdecrypt_generic(<span>$td</span>, <span>$encrypt</span><span>);
       
        </span><span>//</span><span>去除PKCS7补位</span>
        <span>$decrypt</span> = self::PKCS7Decode(<span>$decrypt</span>, mcrypt_enc_get_key_size(<span>$td</span><span>));

        </span><span>//</span><span>关闭加密算法模块</span>
        mcrypt_generic_deinit(<span>$td</span><span>);
        mcrypt_module_close(</span><span>$td</span><span>);

        </span><span>if</span>(<span>strlen</span>(<span>$decrypt</span>) < 16<span>){
            </span><span>throw</span> <span>new</span> \<span>Exception</span>("非法密文字符串!"<span>);
        }

        </span><span>//</span><span>去除随机字符串</span>
        <span>$decrypt</span> = <span>substr</span>(<span>$decrypt</span>, 16<span>);

        </span><span>//</span><span>获取网络字节序</span>
        <span>$size</span> = <span>unpack</span>("N", <span>substr</span>(<span>$decrypt</span>, 0, 4<span>));
        </span><span>$size</span> = <span>$size</span>[1<span>];

        </span><span>//</span><span>APP_ID</span>
        <span>$appid</span> = <span>substr</span>(<span>$decrypt</span>, <span>$size</span> + 4<span>);

        </span><span>//</span><span>验证APP_ID</span>
        <span>if</span>(<span>$appid</span> !== <span>$this</span>-><span>appId){
            </span><span>throw</span> <span>new</span> \<span>Exception</span>("非法APP_ID!"<span>);
        }
        
        </span><span>//</span><span>明文内容</span>
        <span>$text</span> = <span>substr</span>(<span>$decrypt</span>, 4, <span>$size</span><span>);
        </span><span>return</span> <span>$text</span><span>;
    }

    </span><span>/*</span><span>*
     * PKCS7填充字符
     * @param string  $text 被填充字符
     * @param integer $size Block长度
     </span><span>*/</span>
    <span>private</span> <span>static</span> <span>function</span> PKCS7Encode(<span>$text</span>, <span>$size</span><span>){
        </span><span>//</span><span>字符串长度</span>
        <span>$str_size</span> = <span>strlen</span>(<span>$text</span><span>);

        </span><span>//</span><span>填充长度</span>
        <span>$pad_size</span> = <span>$size</span> - (<span>$str_size</span> % <span>$size</span><span>);
        </span><span>$pad_size</span> = <span>$pad_size</span> ? : <span>$size</span><span>;
        
        </span><span>//</span><span>填充的字符</span>
        <span>$pad_chr</span> = <span>chr</span>(<span>$pad_size</span><span>);

        </span><span>//</span><span>执行填充</span>
        <span>$text</span> = <span>str_pad</span>(<span>$text</span>, <span>$str_size</span> + <span>$pad_size</span>, <span>$pad_chr</span>,<span> STR_PAD_RIGHT);

        </span><span>return</span> <span>$text</span><span>;
    }

    </span><span>/*</span><span>*
     * 删除PKCS7填充的字符
     * @param string  $text 已填充的字符
     * @param integer $size Block长度
     </span><span>*/</span>
    <span>private</span> <span>static</span> <span>function</span> PKCS7Decode(<span>$text</span>, <span>$size</span><span>){
        </span><span>//</span><span>获取补位字符</span>
        <span>$pad_str</span> = <span>ord</span>(<span>substr</span>(<span>$text</span>, -1<span>));

        </span><span>if</span> (<span>$pad_str</span> < 1 || <span>$pad_str</span> > <span>$size</span><span>) {
            </span><span>$pad_str</span>= 0<span>;
        } 
            </span><span>return</span> <span>substr</span>(<span>$text</span>, 0, <span>strlen</span>(<span>$text</span>) - <span>$pad_str</span><span>);
        
    }</span>
Copier après la connexion

解决方法:

输出的xml文件是这样的

<span>1</span> <span><</span><span>xml</span><span>></span>
<span>2</span> <span><</span><span>ToUserName</span><span>></span><span><![CDATA[</span><span>gh_249aeb986d99</span><span>]]></span><span><</span><span>\/ToUserName</span><span>></span><span>\n
</span><span>3</span> <span><</span><span>FromUserName</span><span>></span><span><![CDATA[</span><span>oopVmxHZaeQkDPsRcbpwXKkH-J2Q</span><span>]]></span><span><</span><span>\/FromUserName</span><span>></span><span>\n
</span><span>4</span> <span><</span><span>CreateTime</span><span>></span>1448944621<span><</span><span>\/CreateTime</span><span>></span><span>\n
</span><span>5</span> <span><</span><span>MsgType</span><span>></span><span><![CDATA[</span><span>text</span><span>]]></span><span><</span><span>\/MsgType</span><span>></span><span>\n
</span><span>6</span> <span><</span><span>Content</span><span>></span><span><![CDATA[</span><span>\u7ecf\u7406</span><span>]]></span><span><</span><span>\/Content</span><span>></span><span>\n
</span><span>7</span> <span><</span><span>MsgId</span><span>></span>6223169761311044588<span><</span><span>\/MsgId</span><span>></span><span>\n
</span><span>8</span> <span><</span><span>\/xml</span><span>></span>
Copier après la connexion

所以需要进行处理才能让simplexml_load_string处理

在输出的明文内容后面加上

<span>1</span> <span>//明文内容
</span><span>2</span> <span>        $text = substr($decrypt, 4, $size);
</span><span>3</span> <span>//去掉多余的内容
</span><span>4</span>         $text=str_replace('<span><</span><span>\/','</', $text</span><span>);      
</span><span>5</span> <span>        $text</span><span>=str_replace('>\n','>', </span><span>$text);
</span><span>6</span> <span>        return $text;</span>
Copier après la connexion

 

 

安全模式就能正常使用了。

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Il y a des rumeurs selon lesquelles 'l'iPhone 16 pourrait ne pas prendre en charge WeChat', et le consultant technique d'Apple en Chine a déclaré qu'il communiquait avec Tencent au sujet des commissions de l'App Store. Il y a des rumeurs selon lesquelles 'l'iPhone 16 pourrait ne pas prendre en charge WeChat', et le consultant technique d'Apple en Chine a déclaré qu'il communiquait avec Tencent au sujet des commissions de l'App Store. Sep 02, 2024 pm 10:45 PM

Il y a des rumeurs selon lesquelles 'l'iPhone 16 pourrait ne pas prendre en charge WeChat', et le consultant technique d'Apple en Chine a déclaré qu'il communiquait avec Tencent au sujet des commissions de l'App Store.

Tutoriel de génération d'images Deepseek Tutoriel de génération d'images Deepseek Feb 19, 2025 pm 04:15 PM

Tutoriel de génération d'images Deepseek

Des personnes proches du dossier ont répondu que « WeChat pourrait ne pas prendre en charge l'Apple iPhone 16 » : les rumeurs sont des rumeurs Des personnes proches du dossier ont répondu que « WeChat pourrait ne pas prendre en charge l'Apple iPhone 16 » : les rumeurs sont des rumeurs Sep 02, 2024 pm 10:43 PM

Des personnes proches du dossier ont répondu que « WeChat pourrait ne pas prendre en charge l'Apple iPhone 16 » : les rumeurs sont des rumeurs

Qu'est-ce que Bitget Launchpool ? Comment utiliser Bitget Launchpool ? Qu'est-ce que Bitget Launchpool ? Comment utiliser Bitget Launchpool ? Jun 07, 2024 pm 12:06 PM

Qu'est-ce que Bitget Launchpool ? Comment utiliser Bitget Launchpool ?

Site Web officiel chinois GATEO Site Web officiel chinois GATEO Feb 21, 2025 pm 03:06 PM

Site Web officiel chinois GATEO

Téléchargez les dix principales applications de devises numériques dans le cercle des devises. Téléchargez les dix principales applications de devises numériques dans le cercle des devises. Feb 20, 2025 pm 06:15 PM

Téléchargez les dix principales applications de devises numériques dans le cercle des devises.

Quelles sont les dix principales applications d'échange pour la monnaie numérique? Quelles sont les dix principales applications d'échange pour la monnaie numérique? Feb 20, 2025 pm 02:03 PM

Quelles sont les dix principales applications d'échange pour la monnaie numérique?

Quel portefeuille est le plus sûr pour les pièces SHIB ? (À lire pour les débutants) Quel portefeuille est le plus sûr pour les pièces SHIB ? (À lire pour les débutants) Jun 05, 2024 pm 01:30 PM

Quel portefeuille est le plus sûr pour les pièces SHIB ? (À lire pour les débutants)

See all articles