-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
hongbin9
committed
Nov 6, 2022
1 parent
5931633
commit 5450b91
Showing
2 changed files
with
100 additions
and
97 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
<?php | ||
|
||
namespace hobby\weixin; | ||
|
||
/** | ||
* Prpcrypt class | ||
* | ||
* 提供接收和推送给公众平台消息的加解密接口. | ||
*/ | ||
class Prpcrypt | ||
{ | ||
public $key; | ||
|
||
function __construct($k) | ||
{ | ||
$this->key = base64_decode($k . "="); | ||
} | ||
|
||
/** | ||
* 对明文进行加密 | ||
* @param string $text 需要加密的明文 | ||
* @return string 加密后的密文 | ||
*/ | ||
public function encrypt($text, $appid) | ||
{ | ||
try { | ||
//获得16位随机字符串,填充到明文之前 | ||
$random = $this->getRandomStr(); | ||
$text = $random . pack("N", strlen($text)) . $text . $appid; | ||
|
||
$iv = substr($this->key, 0, 16); | ||
//使用自定义的填充方式对明文进行补位填充 | ||
$pkc_encoder = new PKCS7Encoder; | ||
$text = $pkc_encoder->encode($text); | ||
$encrypted = openssl_encrypt($text, 'AES-256-CBC', $this->key, OPENSSL_ZERO_PADDING, $iv); | ||
return array(ErrorCode::$OK, $encrypted); | ||
} catch (Exception $e) { | ||
//print $e; | ||
return array(ErrorCode::$EncryptAESError, null); | ||
} | ||
} | ||
|
||
/** | ||
* 对密文进行解密 | ||
* @param string $encrypted 需要解密的密文 | ||
* @return string 解密得到的明文 | ||
*/ | ||
public function decrypt($encrypted, $appid) | ||
{ | ||
|
||
try { | ||
$iv = substr($this->key, 0, 16); | ||
//使用BASE64对需要解密的字符串进行解码 | ||
$decrypted = openssl_decrypt($encrypted, 'AES-256-CBC', $this->key, OPENSSL_ZERO_PADDING, $iv); | ||
} catch (Exception $e) { | ||
return array(ErrorCode::$DecryptAESError, null); | ||
} | ||
|
||
|
||
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) { | ||
//print $e; | ||
return array(ErrorCode::$IllegalBuffer, null); | ||
} | ||
if ($from_appid != $appid) | ||
return array(ErrorCode::$ValidateAppidError, null); | ||
return array(0, $xml_content); | ||
|
||
} | ||
|
||
|
||
/** | ||
* 随机生成16位字符串 | ||
* @return string 生成的字符串 | ||
*/ | ||
function getRandomStr() | ||
{ | ||
|
||
$str = ""; | ||
$str_pol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"; | ||
$max = strlen($str_pol) - 1; | ||
for ($i = 0; $i < 16; $i++) { | ||
$str .= $str_pol[mt_rand(0, $max)]; | ||
} | ||
return $str; | ||
} | ||
|
||
} |