直接粘代碼,該類是基於微信公衆號消息加密解密所提供的PHP DEMO改造而來,目前使用於彬彬大學APP接口token校驗中。php
php的mcrypt 擴展已通過時了大約10年,而且用起來很複雜。所以它被廢棄而且被 OpenSSL 所取代。 從PHP 7.2起它將被從核心代碼中移除而且移到PECL中。PHP手冊在7.1遷移頁面給出了替代方案,就是用OpenSSL取代MCrypt.
html
class Aes { private $hex_iv = '00000000000000000000000000000000'; # converted JAVA byte code in to HEX and placed it here private $key = '397e2eb61307109f6e68006ebcb62f98'; #Same as in JAVA function __construct($key) { $this->key = $key; $this->key = hash('sha256', $this->key, true); } /* function encrypt($str) { $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); mcrypt_generic_init($td, $this->key, $this->hexToStr($this->hex_iv)); $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $pad = $block - (strlen($str) % $block); $str .= str_repeat(chr($pad), $pad); $encrypted = mcrypt_generic($td, $str); mcrypt_generic_deinit($td); mcrypt_module_close($td); return base64_encode($encrypted); } function decrypt($code) { $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); mcrypt_generic_init($td, $this->key, $this->hexToStr($this->hex_iv)); $str = mdecrypt_generic($td, base64_decode($code)); $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); mcrypt_generic_deinit($td); mcrypt_module_close($td); return $this->strippadding($str); }*/ public function encrypt($input) { $data = openssl_encrypt($input, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->hexToStr($this->hex_iv)); $data = base64_encode($data); return $data; } public function decrypt($input) { $decrypted = openssl_decrypt(base64_decode($input), 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->hexToStr($this->hex_iv)); return $decrypted; } /* For PKCS7 padding */ private function addpadding($string, $blocksize = 16) { $len = strlen($string); $pad = $blocksize - ($len % $blocksize); $string .= str_repeat(chr($pad), $pad); return $string; } private function strippadding($string) { $slast = ord(substr($string, -1)); $slastc = chr($slast); $pcheck = substr($string, -$slast); if (preg_match("/$slastc{" . $slast . "}/", $string)) { $string = substr($string, 0, strlen($string) - $slast); return $string; } else { return false; } } function hexToStr($hex) { $string=''; for ($i=0; $i < strlen($hex)-1; $i+=2) { $string .= chr(hexdec($hex[$i].$hex[$i+1])); } return $string; } }
/** * @param array $data * 生成每次請求的sign 加密信息 * @return string * Author: yehui * Date: 2019/11/19 23:33 */ public static function setSign($data = []){ // 1 按字段排序 ksort($data); // 2 拼接字符串數據 & //$data = array('foo'=>'bar', // 'baz'=>'boom', // 'php'=>'hypertext processor'); //echo http_build_query($data); ///* 輸出: // foo=bar&baz=boom&php=hypertext+processor //*/ $string = http_build_query($data); //http_build_query — 生成 URL-encode 以後的請求字符串 // 3 經過aes加密 $aes = new Aes(config('app.aeskey')); $string = $aes->encrypt($string); // 4 最終返回加密的數據 return $string; }
public function testAes(){
$data = [
'name'=>'yh',
'age'=>12,
];
$str = '05rIEfJkLlXQpjuUgxFgMw=='; //加密後的數據
//echo IAuth::setSign($data);//05rIEfJkLlXQpjuUgxFgMw== 加密後的數據
$aes = new Aes(config('app.aeskey'));
echo $aes->decrypt('05rIEfJkLlXQpjuUgxFgMw==');//age=12&name=yh 解密後的數據
}