一、AES简介
高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图:
注:此处暂时不详细介绍AES加密的内容,想进一步了解的读者可以去查找相关资料。
二、使用PHP进行AES加密:
class Aes {
private $key = null;
/**
*
* @param $key 密钥
* @return String
*/
public function __construct($key) {
//此处采用的是AES-128的方式进行加密,所以key值必须为16位的字符串
$this->key = $key;
}
/**
* Mcrypt的方式加密
* @param String input 加密的字符串
* @param String key 解密的key
* @return HexString
*/
public function encrypt($input = '') {
$size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$input = $this->pkcs5_pad($input, $size);
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $this->key, $iv);
$data = mcrypt_generic($td, $input);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$data = base64_encode($data);
return $data;
}
/**
* 填充方式 pkcs5
* @param String text 原始字符串
* @param String blocksize 加密长度
* @return String
*/
private function pkcs5_pad($text, $blocksize) {
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
/**
* 解密
* @param String input 解密的字符串
* @param String key 解密的key
* @return String
*/
public function decrypt($sStr) {
$decrypted= mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$this->key,base64_decode($sStr), MCRYPT_MODE_ECB);
$dec_s = strlen($decrypted);
$padding = ord($decrypted[$dec_s-1]);
$decrypted = substr($decrypted, 0, -$padding);
return $decrypted;
}
/**
* 用openssl进行解密
* @param String data 加密的字符串
* @param String method 加密的方式
* @return String
*/
public function encrypt_openssl($data,$method = 'AES-128-ECB')
{
return openssl_encrypt($data,$method,$this->key);
}
/**
* 用openssl进行解密
* @param String data 解密的字符串
* @param String method 解密的方式
* @return String
*/
public function decrypt_openssl($data,$method = 'AES-128-ECB')
{
return openssl_decrypt($data,$method,$this->key);
}
}
接下来,我们如下使用以上的类:
$data = [
'name' => 'handsome',
'id' => 1
];
$data = http_build_query($data);
//http_build_query()函数能把数组转换成name=handsome&id=1这样的形式
$Aes = new Aes('handsome333rui77');//此处的key是随便输入的16位字符串
var_dump($Aes->encrypt($data)); //结果为:9lRks1VZcWHbh/z8LQWFNHEYcelQ8DcTS/y0uTFNhcc=
var_dump($Aes->decrypt('9lRks1VZcWHbh/z8LQWFNHEYcelQ8DcTS/y0uTFNhcc=')); //解密,结果为:name=handsome&id=1
var_dump($Aes->encrypt_openssl($data)); //加密
var_dump($Aes->decrypt_openssl('9lRks1VZcWHbh/z8LQWFNHEYcelQ8DcTS/y0uTFNhcc=')); //解密
注:在PHP7中,Mcrypt已经被抛弃,所以,php7版本以上的推荐使用openssl