介绍
这篇文章将为大家详细讲解有关怎么在PHP 7.1中利用OpenSSL实现一个加解密功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
<强>原因:强>
调试的时候发现,直接原因是因为开放平台里面填写的授权事件(该授权事件每十分钟会通送一次事件来更新票),即:
这个地方填写的url,调试发现,这没个url错,微信也有每10分钟推送过来,但是到最后一直接收不到票,看代码发现是因为解密微信过来的数据的时候报错了:
& lt; ? php , function aes_decode(消息,美元,美元encodingaeskey =, & # 39; & # 39;,, appid 美元;=,& # 39;& # 39;),{, ,key 美元;=,base64_decode (encodingaeskey 美元;只& # 39;=& # 39;),, , ,ciphertext_dec 美元;=,base64_decode(美元消息),, ,iv 美元;=,substr(美元关键,,0,,16),, , ,module 美元;=,mcrypt_module_open (MCRYPT_RIJNDAEL_128, & # 39; & # 39;,, MCRYPT_MODE_CBC,, & # 39; & # 39;),, ,mcrypt_generic_init(模块,美元,钥匙,美元,美元iv),, ,decrypted 美元;=,mdecrypt_generic($模块,ciphertext_dec美元),, 美元,mcrypt_generic_deinit(模块),, 美元,mcrypt_module_close(模块),, , ,pad 美元;=,奥德(substr(解密美元,,1)),, ,if (pad 美元;& lt;, 1, | |, pad 美元;祝辞,32),{, ,pad 美元;=,0,, 以前,}>即这个地方,由于我的环境是PHP 7.1,查找资料发现PHP 7.1已经废弃了Mcrypt,所以这个代码里面的mcrypt_ *都是无法运行的。
<强>解决:强>
查找资料发现,可以通过OpenSSL来代替Mcrypt(前提是已经安装了OpenSSL扩展,不过一般都是默认安装的)
OpenSSL是一个功能强大的工具包,它集成了众多密码算法及实用工具。我们即可以利用它提供的命令台工具生成密钥,证书来加密解密文件,也可以在利用其提供的API接口在代码中对传输信息进行加密。
<强>所以上面的代码可以改为:强>
& lt; ? php , function aes_decode(消息,美元,美元encodingaeskey =, & # 39; & # 39;,, appid 美元;=,& # 39;& # 39;),{, ,key 美元;=,base64_decode (encodingaeskey 美元;只& # 39;=& # 39;),, , ,ciphertext_dec 美元;=,base64_decode(美元消息),, ,iv 美元;=,substr(美元关键,,0,,16),, , ,/* mcrypt对称解密代码在PHP7.1已经被抛弃了,所以使用下面的openssl来代替, ,module 美元;=,mcrypt_module_open (MCRYPT_RIJNDAEL_128, & # 39; & # 39;,, MCRYPT_MODE_CBC,, & # 39; & # 39;),, ,mcrypt_generic_init(模块,美元,钥匙,美元,美元iv),, ,decrypted 美元;=,mdecrypt_generic($模块,ciphertext_dec美元),, 美元,mcrypt_generic_deinit(模块),, 美元,mcrypt_module_close(模块),, ,*/,decrypted 美元;=,openssl_decrypt (ciphertext_dec美元,& # 39;aes - 256 - cbc # 39;,,关键,美元,OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING,, 4美元),, , ,pad 美元;=,奥德(substr(解密美元,,1)),, ,if (pad 美元;& lt;, 1, | |, pad 美元;祝辞,32),{, ,pad 美元;=,0,, 以前,}><强>补充:强>
上面的解密已经修改了,那么对应的Mcrypt加密也需要修改,如果不改的话会导致不能全网发布以及不能推送消息等事件
加密的源代码如下:& lt; ? php function aes_encode(消息,美元,美元encodingaeskey =, & # 39; & # 39;,, appid 美元;=,& # 39;& # 39;),{, ,key 美元;=,base64_decode (encodingaeskey 美元;只& # 39;=& # 39;),, ,text 美元;=,随机(16),只包(“N",, strlen(消息)美元),只message 美元;只appid;美元, ,iv 美元;=,substr(美元关键,,0,,16),, , ,block_size 美元;=,32岁,, ,text_length 美元;=,strlen(文本),, 美元,美元amount_to_pad =, block_size 作用;(text_length 美元;%,block_size美元),, ,if (amount_to_pad 美元;==,0),{, block_size美元,美元amount_to_pad =,,, }大敌; ,pad_chr 美元;=,($ amount_to_pad);从而向, ,tmp 美元;=,& # 39;& # 39;,, ,for (index 美元;=,0;,index 美元;& lt;, amount_to_pad;美元,美元指数+ +),{, tmp 美元。=,pad_chr;美元, }大敌; 美元,美元text =, text 只tmp美元;, ,size 美元;=,mcrypt_get_block_size (MCRYPT_MODE_CBC MCRYPT_RIJNDAEL_128也),, ,module 美元;=,mcrypt_module_open (MCRYPT_RIJNDAEL_128, & # 39; & # 39;,, MCRYPT_MODE_CBC,, & # 39; & # 39;),, ,mcrypt_generic_init(模块,美元,钥匙,美元,美元iv),, ,encrypted 美元;=,mcrypt_generic(模块,美元,美元文本),, 美元,mcrypt_generic_deinit(模块),, 美元,mcrypt_module_close(模块),, , ,encrypt_msg 美元;=,base64_encode(加密),, ,return encrypt_msg美元; }怎么在PHP 7.1中利用OpenSSL实现一个加解密功能