目录
thinkphp微信开发:安全模式消息加解密,thinkphp解密
解决方法:
首页 php教程 php手册 thinkphp微信开发:安全模式消息加解密,thinkphp解密

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

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

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>
登录后复制

解决方法:

输出的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>
登录后复制

所以需要进行处理才能让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>
登录后复制

 

 

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

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1673
14
CakePHP 教程
1429
52
Laravel 教程
1333
25
PHP教程
1278
29
C# 教程
1257
24
ThinkPHP6路由:如何完整获取包含中文等特殊字符的URL参数? ThinkPHP6路由:如何完整获取包含中文等特殊字符的URL参数? Apr 01, 2025 pm 02:51 PM

ThinkPHP6路由参数中文处理及完整获取在ThinkPHP6框架中,处理包含特殊字符(如中文及标点符号)的URL参数,常常...

公司安全软件导致应用无法运行?如何排查和解决? 公司安全软件导致应用无法运行?如何排查和解决? Apr 19, 2025 pm 04:51 PM

公司安全软件导致部分应用无法正常运行的排查与解决方法许多公司为了保障内部网络安全,会部署安全软件。...

H5页面制作和微信小程序有什么不同 H5页面制作和微信小程序有什么不同 Apr 05, 2025 pm 11:51 PM

H5更灵活,可定制性强,但需要娴熟的技术;小程序上手快,维护便捷,但受限于微信框架。

企业微信中的JS资源缓存问题如何解决? 企业微信中的JS资源缓存问题如何解决? Apr 04, 2025 pm 05:06 PM

企业微信的JS资源缓存问题探讨在进行项目功能升级时,常常会遇到部分用户未能成功升级的情况,尤其是在企�...

H5和小程序与APP的区别 H5和小程序与APP的区别 Apr 06, 2025 am 10:42 AM

H5、小程序和APP的主要区别在于:技术架构:H5基于网页技术,小程序和APP为独立应用程序。体验和功能:H5轻便易用,功能受限;小程序轻量级,交互性好;APP功能强大,体验流畅。兼容性:H5跨平台兼容,小程序和APP受平台限制。开发成本:H5开发成本低,小程序中等,APP最高。适用场景:H5适合信息展示,小程序适合轻量化应用,APP适合复杂功能应用。

公司安全软件与应用冲突怎么办?HUES安全软件导致常用软件无法打开如何排查? 公司安全软件与应用冲突怎么办?HUES安全软件导致常用软件无法打开如何排查? Apr 01, 2025 pm 10:48 PM

公司安全软件与应用兼容性问题及排查方法许多企业为了保障内网安全,会安装安全软件。然而,安全软件有时...

laravel和thinkphp的区别 laravel和thinkphp的区别 Apr 18, 2025 pm 01:09 PM

Laravel 和 ThinkPHP 都是流行的 PHP 框架,在开发中各有优缺点。本文将深入比较这两者,重点介绍它们的架构、特性和性能差异,以帮助开发者根据其特定项目需求做出明智的选择。

H5和小程序的开发工具有哪些 H5和小程序的开发工具有哪些 Apr 06, 2025 am 09:54 AM

H5开发工具推荐:VSCode、WebStorm、Atom、Brackets、Sublime Text;小程序开发工具:微信开发者工具、支付宝小程序开发者工具、百度智能小程序IDE、头条小程序开发者工具、Taro。

See all articles