作者 郭文星

123

1 <?php 1 <?php
2 -  
3 -namespace lib;  
4 - 2 +namespace wx;
  3 +use wx\ErrorCode;
5 class WXBizDataCrypt 4 class WXBizDataCrypt
6 { 5 {
7 -  
8 private $appid; 6 private $appid;
9 private $sessionKey; 7 private $sessionKey;
10 8
@@ -13,9 +11,8 @@ class WXBizDataCrypt @@ -13,9 +11,8 @@ class WXBizDataCrypt
13 * @param $sessionKey string 用户在小程序登录后获取的会话密钥 11 * @param $sessionKey string 用户在小程序登录后获取的会话密钥
14 * @param $appid string 小程序的appid 12 * @param $appid string 小程序的appid
15 */ 13 */
16 - public function __construct($appid, $sessionKey) 14 + public function __construct( $appid, $sessionKey)
17 { 15 {
18 -  
19 $this->sessionKey = $sessionKey; 16 $this->sessionKey = $sessionKey;
20 $this->appid = $appid; 17 $this->appid = $appid;
21 } 18 }
@@ -30,190 +27,33 @@ class WXBizDataCrypt @@ -30,190 +27,33 @@ class WXBizDataCrypt
30 * @return int 成功0,失败返回对应的错误码 27 * @return int 成功0,失败返回对应的错误码
31 */ 28 */
32 public function decryptData( $encryptedData, $iv, &$data ) 29 public function decryptData( $encryptedData, $iv, &$data )
33 -  
34 { 30 {
35 -  
36 if (strlen($this->sessionKey) != 24) { 31 if (strlen($this->sessionKey) != 24) {
37 -  
38 return ErrorCode::$IllegalAesKey; 32 return ErrorCode::$IllegalAesKey;
39 -  
40 } 33 }
41 -  
42 $aesKey=base64_decode($this->sessionKey); 34 $aesKey=base64_decode($this->sessionKey);
43 35
44 - if (strlen($iv) != 24) {  
45 36
  37 + if (strlen($iv) != 24) {
46 return ErrorCode::$IllegalIv; 38 return ErrorCode::$IllegalIv;
47 -  
48 } 39 }
49 -  
50 $aesIV=base64_decode($iv); 40 $aesIV=base64_decode($iv);
51 41
52 -// $aesCipher=base64_decode($encryptedData);  
53 -  
54 - $aesCipher=$encryptedData;  
55 -  
56 - $pc = new Prpcrypt($aesKey);  
57 -  
58 - $result = $pc->decrypt($aesCipher,$aesIV);  
59 -  
60 - var_dump($result);  
61 -  
62 - if ($result[0] != 0) {  
63 -  
64 - return $result[0];  
65 -  
66 - }  
67 -  
68 - $dataObj=json_decode( $result[1] ); 42 + $aesCipher=base64_decode($encryptedData);
69 43
70 - if( $dataObj == NULL ) 44 + $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
71 45
  46 + $dataObj=json_decode( $result );
  47 + if( $dataObj == NULL )
72 { 48 {
73 -  
74 - return ErrorCode::$IllegalBuffer.'--';  
75 - 49 + return ErrorCode::$IllegalBuffer;
76 } 50 }
77 -  
78 if( $dataObj->watermark->appid != $this->appid ) 51 if( $dataObj->watermark->appid != $this->appid )
79 -  
80 { 52 {
81 -  
82 - return ErrorCode::$IllegalBuffer.';;';  
83 - 53 + return ErrorCode::$IllegalBuffer;
84 } 54 }
85 -  
86 - $data = $result[1];  
87 - 55 + $data = $result;
88 return ErrorCode::$OK; 56 return ErrorCode::$OK;
89 -  
90 } 57 }
91 58
92 -}  
93 -  
94 -/**  
95 - * PKCS7Encoder class  
96 - *  
97 - * 提供基于PKCS7算法的加解密接口.  
98 - */  
99 -class PKCS7Encoder  
100 -{  
101 - public static $block_size = 16;  
102 -  
103 - /**  
104 - * 对需要加密的明文进行填充补位  
105 - * @param $text 需要进行填充补位操作的明文  
106 - * @return 补齐明文字符串  
107 - */  
108 - function encode($text)  
109 - {  
110 - $block_size = PKCS7Encoder::$block_size;  
111 - $text_length = strlen($text);  
112 - //计算需要填充的位数  
113 - $amount_to_pad = PKCS7Encoder::$block_size - ($text_length % PKCS7Encoder::$block_size);  
114 - if ($amount_to_pad == 0) {  
115 - $amount_to_pad = PKCS7Encoder::block_size;  
116 - }  
117 - //获得补位所用的字符  
118 - $pad_chr = chr($amount_to_pad);  
119 - $tmp = "";  
120 - for ($index = 0; $index < $amount_to_pad; $index++) {  
121 - $tmp .= $pad_chr;  
122 - }  
123 - return $text . $tmp;  
124 - }  
125 -  
126 - /**  
127 - * 对解密后的明文进行补位删除  
128 - * @param decrypted 解密后的明文  
129 - * @return 删除填充补位后的明文  
130 - */  
131 - function decode($text)  
132 - {  
133 -  
134 - $pad = ord(substr($text, -1));  
135 - if ($pad < 1 || $pad > 32) {  
136 - $pad = 0;  
137 - }  
138 - return substr($text, 0, (strlen($text) - $pad));  
139 - }  
140 -  
141 -}  
142 -  
143 -/**  
144 - * Prpcrypt class  
145 - *  
146 - *  
147 - */  
148 -class Prpcrypt  
149 -{  
150 - public $key;  
151 -  
152 - function __construct($k)  
153 - {  
154 - $this->key = $k;  
155 - }  
156 -  
157 - /**  
158 - * 对密文进行解密  
159 - * @param string $aesCipher 需要解密的密文  
160 - * @param string $aesIV 解密的初始向量  
161 - * @return string 解密得到的明文  
162 - */  
163 - public function decrypt( $aesCipher, $aesIV )  
164 -  
165 - {  
166 -  
167 - try {  
168 -  
169 -// $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');  
170 -  
171 -// mcrypt_generic_init($module, $this->key, $aesIV);  
172 -  
173 -// //解密  
174 -  
175 -// $decrypted = mdecrypt_generic($module, $aesCipher);  
176 -  
177 -// mcrypt_generic_deinit($module);  
178 -  
179 -// mcrypt_module_close($module);  
180 -  
181 - $decrypted = openssl_decrypt($aesCipher,'AES-128-CBC',$this->key,OPENSSL_ZERO_PADDING,$aesIV);  
182 -  
183 - var_dump($decrypted);  
184 -  
185 - } catch (Exception $e) {  
186 -  
187 - return array(ErrorCode::$IllegalBuffer, null);  
188 -  
189 - }  
190 -  
191 - try {  
192 -  
193 -//去除补位字符  
194 -  
195 - $pkc_encoder = new PKCS7Encoder;  
196 -  
197 - $result = $pkc_encoder->decode($decrypted);  
198 -  
199 - } catch (Exception $e) {  
200 -  
201 -//print $e;  
202 -  
203 - return array(ErrorCode::$IllegalBuffer, null);  
204 -  
205 - }  
206 -  
207 - return array(0, $result);  
208 -  
209 - }  
210 -}  
211 -  
212 -class ErrorCode  
213 -{  
214 - public static $OK = 0;  
215 - public static $IllegalAesKey = -41001;  
216 - public static $IllegalIv = -41002;  
217 - public static $IllegalBuffer = -41003;  
218 - public static $DecodeBase64Error = -41004;  
219 } 59 }