巨坑:微信小程序用户信息加密解密(贴出数据方便大家测试)
<?php
$appid = 'wx9bc23a213818b5d6';
$iv = 'aPsEWbOPfJIkhox5SEJ2Fg==';
$encryptedData = 'W7qZC6qhy0q+8N0L87GpD9iasN3KgVMY7Vo9qTQvNObcOd21D3D5+dkjIAx+AmMtRRNFESt3tSxbRhQmuwUGd918AEY1hfcRkjXWIC0+vEfFYqg2faMC/QbxXiUI/QDpmfiG91StQqaq/Q9oai1uFvMjoAy+pReJ2jSau7YqcWSoAqm1kJSZjMMPkMk7O1kYniz/2Lj8rXvxhdqfkyyTlNzO/vMe9odRZy3ShBfcAnWMghH9pgSE3/qIk/aYGpc44oEXNNRE5donsmoIx0ZeUa5cUjsnfx/XUtIAK5fz4h/5AuebPLOZIWhB+NQR7VFgHt0QNyT7L5XdZNkIy4nmn4iQd9zWYS2OuTuJZW6Qr7BEJGbh7lfr24Y6iZjLVEzKwAOoY41OcDUED543y0hcX
oWk9l0QInlCLYxBPZ4gELxPAJRmGuwjN2CRaJz0F61PqLGhzq9ih1uAkPbIvnoHWC5blWuVRxc+3N8E3hGst6bAz7e1rIWb3HJSooSa67Jl';
$sessionKey = '9yjhuwVi9qYKnNpqw9sgVg==';
$pc = new WXBizDataCrypt($appid, $sessionKey); //这里的解密规则可以看文档,仔细看过就能懂(已经理解过)
$errCode = $pc->decryptData($encryptedData, $iv, $data);
下面是要修改的文件类:WXBizDataCrypt.php中方法
/**
* 检验数据的真实性,并且获取解密后的明文.
* @param $encryptedData string 加密的用户数据
* @param $iv string 与用户数据一同返回的初始向量
* @param $data string 解密后的原文
*
* @return int 成功0,失败返回对应的错误码
*/
public function decryptData($encryptedData, $iv, &$data)
{
if (strlen($this->sessionKey) != 24) {
return ErrorCode::$IllegalAesKey;
}
$aesKey = base64_decode($this->sessionKey);
if (strlen($iv) != 24) {
return ErrorCode::$IllegalIv;
}
$aesIV = base64_decode($iv);
// $aesCipher = base64_decode($encryptedData);
$aesCipher = $encryptedData;
$pc = new Prpcrypt($aesKey);
$result = $pc->decrypt($aesCipher, $aesIV);
if ($result[0] != 0) {
return $result[0];
}
$dataObj = json_decode($result[1]);
// echo "<pre>";print_r($dataObj);die;
if ($dataObj == NULL) {
return ErrorCode::$IllegalBuffer . '--';
}
if ($dataObj->watermark->appid != $this->appid) {
return ErrorCode::$IllegalBuffer . ';;';
}
$data = $result[1];
return ErrorCode::$OK;
}
还有解密的方法类:PKCS7Encoder.php 中的class Prpcrypt
/**
* Prpcrypt class
*
*
*/
class Prpcrypt
{
public $key;
function __construct($k)
{
$this->key = $k;
}
/**
* 对密文进行解密
* @param string $aesCipher 需要解密的密文
* @param string $aesIV 解密的初始向量
* @return string 解密得到的明文
*/
public function decrypt($aesCipher, $aesIV)
{
try {
$decrypted = openssl_decrypt($aesCipher, 'AES-128-CBC', $this->key, OPENSSL_ZERO_PADDING, $aesIV);
} catch (Exception $e) {
return array(ErrorCode::$IllegalBuffer, null);
}
try {
//去除补位字符
$pkc_encoder = new PKCS7Encoder;
$result = $pkc_encoder->decode($decrypted);
} catch (Exception $e) {
return array(ErrorCode::$IllegalBuffer, null);
}
return array(0, $result);
}
}