初始化项目:添加后端代码、ThinkPHP框架、前端资源
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the overtrue/wechat.
|
||||
*
|
||||
* (c) overtrue <i@overtrue.me>
|
||||
*
|
||||
* This source file is subject to the MIT license that is bundled
|
||||
* with this source code in the file LICENSE.
|
||||
*/
|
||||
|
||||
namespace douyin;
|
||||
|
||||
use app\common\exception\Exception;
|
||||
use douyin\AES;
|
||||
|
||||
/**
|
||||
* Class Encryptor.
|
||||
*
|
||||
* @author mingyoung <mingyoungcheung@gmail.com>
|
||||
*/
|
||||
class Encryptor
|
||||
{
|
||||
/**
|
||||
* Decrypt data.
|
||||
*
|
||||
* @param string $sessionKey
|
||||
* @param string $iv
|
||||
* @param string $encrypted
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function decryptData(string $sessionKey, string $iv, string $encrypted): array
|
||||
{
|
||||
|
||||
$decrypted = AES::decrypt(
|
||||
base64_decode($encrypted, false), base64_decode($sessionKey, false), base64_decode($iv, false)
|
||||
);
|
||||
|
||||
$decrypted = json_decode($this->pkcs7Unpad($decrypted), true);
|
||||
if (!$decrypted) {
|
||||
throw new Exception('The given payload is invalid.');
|
||||
}
|
||||
|
||||
return $decrypted;
|
||||
}
|
||||
|
||||
|
||||
const ERROR_INVALID_SIGNATURE = -40001; // Signature verification failed
|
||||
const ERROR_CALC_SIGNATURE = -40003; // Calculating the signature failed
|
||||
const ERROR_INVALID_AES_KEY = -40004; // Invalid AESKey
|
||||
const ERROR_INVALID_APP_ID = -40005; // Check AppID failed
|
||||
const ERROR_ENCRYPT_AES = -40006; // AES EncryptionInterface failed
|
||||
const ERROR_DECRYPT_AES = -40007; // AES decryption failed
|
||||
const ERROR_BASE64_ENCODE = -40009; // Base64 encoding failed
|
||||
const ERROR_BASE64_DECODE = -40010; // Base64 decoding failed
|
||||
const ILLEGAL_BUFFER = -41003; // Illegal buffer
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $aesKey;
|
||||
|
||||
/**
|
||||
* Block size.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
protected $blockSize = 32;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param string $appId
|
||||
* @param string|null $token
|
||||
* @param string|null $aesKey
|
||||
*/
|
||||
public function __construct(string $aesKey = null)
|
||||
{
|
||||
$this->aesKey = base64_decode($aesKey.'=', true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get SHA1.
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* @throws self
|
||||
*/
|
||||
public function signature(): string
|
||||
{
|
||||
$array = func_get_args();
|
||||
sort($array, SORT_STRING);
|
||||
|
||||
return sha1(implode($array));
|
||||
}
|
||||
|
||||
/**
|
||||
* PKCS#7 pad.
|
||||
*
|
||||
* @param string $text
|
||||
* @param int $blockSize
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
*/
|
||||
public function pkcs7Pad($text, $blockSize)
|
||||
{
|
||||
if ($blockSize > 256) {
|
||||
throw new Exception('$blockSize may not be more than 256');
|
||||
}
|
||||
$padding = $blockSize - (strlen($text) % $blockSize);
|
||||
$pattern = chr($padding);
|
||||
|
||||
return $text.str_repeat($pattern, $padding);
|
||||
}
|
||||
|
||||
/**
|
||||
* PKCS#7 unpad.
|
||||
*
|
||||
* @param string $text
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function pkcs7Unpad($text)
|
||||
{
|
||||
$pad = ord(substr($text, -1));
|
||||
if ($pad < 1 || $pad > $this->blockSize) {
|
||||
$pad = 0;
|
||||
}
|
||||
|
||||
return substr($text, 0, (strlen($text) - $pad));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user