php7.1发布后新特性吸引了不少PHPer,大家都在讨论新特性带来的好处与便利。但是从php7.0 升级到 php7.1 废弃(过时)
了一个在过去普遍应用的扩展(mcrypt扩展)。官方提供了相应的解决提示,却没有提供更详细的解决办法。于是坑来了…. --- 引用自http://blog.csdn.net/sapperlab/article/details/56672443
坑真的来了。。。。
openssl_encrypt 加密相当于将 mcrypt_encrypt 的加密结果执行一次 base64_encode
openssl_decode 解密相当于 先将加密结果执行一次base64_decode 然后再通过mcrypt_encrypt 解密
下面贴代码,mcrypt就不贴了,微信有给出官方的demo,下面贴一下真实环境下可以实现通信的代码,别问我管不管用,至少本人的调通了。。 同样 欢迎各路神仙来拍砖,指正。。。更希望用上面方式走通的朋友留言指点一下,不胜感激
其实本人最终是卡在了加密这块,解密没啥可说的
加密这里通过一步一步的拆解调试,最终发现openssl_encrypt加密结果比官方给的mcrypt_generic加密结果多了16位。。
同样需要对加密结果进行一次base64!!!!
/**
* 对明文进行加密
* @param string $text 需要加密的明文
* @return string 加密后的密文
*/
public function encrypt($text, $appid)
{
try {
//获得16位随机字符串,填充到明文之前
$random = $this->getRandomStr();
$text = $random . pack("N", strlen($text)) . $text . $appid;
//使用自定义的填充方式对明文进行补位填充
$pkc_encoder = new PKCS7Encoder();
$text = $pkc_encoder->encode($text);
$iv = substr($this->key, 0, 16);
$encrypted = openssl_encrypt($text, 'aes-256-cbc', $this->key, OPENSSL_RAW_DATA, $iv);
$encrypted = substr($encrypted,0,strlen($encrypted)-16);
//print(base64_encode($encrypted));
//使用BASE64对加密后的字符串进行编码
return ['errcode' => 0, 'encrypt' => base64_encode($encrypted)];
} catch (Exception $e) {
return ErrorCode::$EncryptAESError;
}
}
/**
* 对密文进行解密
* @param string $encrypted 需要解密的密文
* @return string 解密得到的明文
*/
public function decrypt($encrypted, $appid)
{
try {
//使用BASE64对需要解密的字符串进行解码
$iv = substr($this->key, 0, 16);
$ciphertext_dec = base64_decode($encrypted);
$decrypted = openssl_decrypt($ciphertext_dec, 'aes-256-cbc', $this->key, OPENSSL_RAW_DATA, $iv);
} catch (Exception $e) {
return ErrorCode::$DecryptAESError;
}
try {
//去除补位字符
$pkc_encoder = new PKCS7Encoder;
$result = $pkc_encoder->decode($decrypted);
//去除16位随机字符串,网络字节序和AppId
if (strlen($result) < 16) {
return "";
}
$content = substr($result, 16, strlen($result));
$len_list = unpack("N", substr($content, 0, 4));
$xml_len = $len_list[1];
$xml_content = substr($content, 4, $xml_len);
$from_appid = substr($content, $xml_len + 4);
} catch (Exception $e) {
return ErrorCode::$IllegalBuffer;
}
if ($from_appid != $appid) {
return ErrorCode::$ValidateAppidError;
}
return ['errcode' => 0, 'decrypt' => $xml_content];
}