每天学习一点点,成功增加一大步

PHP笔记:MCRYPT 与 OPENSSL 的时代交替

PHP zhanghui 197℃

本周在做一个新的需求性的项目的开发,中间就涉及到企业微信及企业微信第三方服务商的关联性开发,在这开发中是遇到了不少的坑,其中就涉及到数据传输过程中需要的加解密的算法,当接收到微信推送的加密信息后需要通过解密的方式才能得到你想要的明文数据。

当时在网上找到 GITHUB 资源:点这里

只要正常的环境下按照官方文档上写得去做就能得到你想要的数据,可这次偏偏遇到不一样的 PHP 环境。那就是 PHP 7 及以上,官方的工具在该以下的版本如 PHP 5 系列的运行很正常,可到了 PHP 7 及以上的版本就有问题了。

那是因为在 PHP 7 中加解密算法【MCRYPT】的算法被抛弃了,如果你的 PHP 的 WINDOWS 版本还是 7.0 系列的话还是可以勉强支持,因为实践过程发现 WINDOWS 版本的 PHP 7.0.29 和 PHP 7.0.31 在实践过程中还是可以的,但到了 LINUX 的版本就不行,运行 PHPINFO 函数发现 LINUX 中的 MCRYPT  已经不存在了。

开发环境可以用 WINDOWS , 但在线生产环境还是比较推崇 LINUX 这是基于服务器的优越性的考虑。那么如何解决上次的问题在网上有提到过用 OPENSSL 的文章,但很多文章存在懒惰性的复制粘贴的做法,根本就没有实践过是否能正常使用,也许原作者当时的实践是可以的,后来腾讯官方中间也经过多次的修改导致之前的方法现在实测过来没有起效,至少这次的亲测不顺利。

但经过多次实测还是找到了解决的方法,还是基于网上的解决思维但是有些变化。还是基于官方的解密工具,现记录下来以供参考。

这个加解密的文件是在 pkcs7Encoder.php 的【Prpcrypt】类中。

MCRYPT 的解密:

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

MCRYPT 的加密:

$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '',
                    MCRYPT_MODE_CBC, '');
//使用自定义的填充方式对明文进行补位填充
$pkc_encoder = new PKCS7Encoder;
$text = $pkc_encoder->encode($text);
$iv = substr($this->key, 0, 16);
mcrypt_generic_init($module, $this->key, $iv);
//加密
$encrypted = mcrypt_generic($module, $text);
mcrypt_generic_deinit($module);
mcrypt_module_close($module);

OPENSSL 解密:

$decrypted = openssl_decrypt(base64_decode($encrypted), 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING);

OPENSSL 加密

$encrypted = openssl_encrypt($text, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING);

当然中间可以加上对 PHP 版本的判断,做到高低版本都兼容。也可以直接用 OPENSSL 这个在 PHP 5.3.3 ~ 7.2.0 版本均可使用。

version_compare(phpversion(), '7.0', '>=')

今天放假在 GITHUB 上发现有个资源,但我已经解决了,所以这个资源可以当做收藏了。

,点这里

转载请注明:隨習筆記 » PHP笔记:MCRYPT 与 OPENSSL 的时代交替