PHP7.2中AES加密解密方法mcrypt_module_open()替换方案 Function mcrypt_get_block_size() is deprecated

时间:2023-03-09 06:54:30
PHP7.2中AES加密解密方法mcrypt_module_open()替换方案   Function mcrypt_get_block_size() is deprecated

直接粘代码,该类是基于微信公众号消息加密解密所提供的PHP DEMO改造而来,目前使用于彬彬大学APP接口token校验中。

php的mcrypt 扩展已经过时了大约10年,并且用起来很复杂。因此它被废弃并且被 OpenSSL 所取代。 从PHP 7.2起它将被从核心代码中移除并且移到PECL中。PHP手册在7.1迁移页面给出了替代方案,就是用OpenSSL取代MCrypt.

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;
} }

PHP7.2中AES加密解密方法mcrypt_module_open()替换方案   Function mcrypt_get_block_size() is deprecated

PHP7.2中AES加密解密方法mcrypt_module_open()替换方案   Function mcrypt_get_block_size() is deprecated

PHP7.2中AES加密解密方法mcrypt_module_open()替换方案   Function mcrypt_get_block_size() is deprecated

PHP7.2中AES加密解密方法mcrypt_module_open()替换方案   Function mcrypt_get_block_size() is deprecated

    /**
* @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 解密后的数据
}
 

PHP7.2中AES加密解密方法mcrypt_module_open()替换方案   Function mcrypt_get_block_size() is deprecated

PHP7.2中AES加密解密方法mcrypt_module_open()替换方案   Function mcrypt_get_block_size() is deprecated