怎么在PHP 7.1中利用OpenSSL实现一个加解密功能

  介绍

这篇文章将为大家详细讲解有关怎么在PHP 7.1中利用OpenSSL实现一个加解密功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

<强>原因:

调试的时候发现,直接原因是因为开放平台里面填写的授权事件(该授权事件每十分钟会通送一次事件来更新票),即:

怎么在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实现一个加解密功能