在最近的项目中,前端后台数据交互需要进行加密之后传输使用,以保证系统数据的安全。有关数据加密解密的问题,有很多种加密的方式,在这里我选择了AES的加密方式。特此写下此篇博文,总结讲述下PHP和JS进行相互AES加密解密的方法。
关于源代码点击地址进行下载:http://download.csdn.net/download/zhihua_w/10261363
/**
* php生成加密字符串,在前端网页模板中用JS解密来用
* 基于PHP和JS的AES相互加密解密方法详解(CryptoJS)
* @param $data string/必填
* @param $type int/选填 [默认0加密 1=解密 ]
* 模板中要加载三个JS文件 路径:\public\static\php_js_aes
* 调用
* 加密:php_encrypt_js($json_string);
* 解密:php_encrypt_js($json_string,1);
*/
function php_encrypt_js($data,$type){
//加密向量16位
$iv = "ZZWBKJ_ZHIHUAWEI";
if($type){//解密
//PHP加密秘钥16位
$key = date('Y-m-d',time())."eDu189";
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($data), MCRYPT_MODE_CBC, $iv);
$json_str = rtrim($decrypted, "\0");
return json_decode($json_str);
}else{//加密
//转换成json字符串
$data = json_encode($data);
//PHP加密秘钥16位
$key = date('Y-m-d',time())."cms39F";
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
return base64_encode($encrypted);
}
}
生成
$json_string='{"username":"1001","password":"123456","terminal":"PC"}';
$pp = php_encrypt_js($json_string);
echo $pp;
下面是修改过的代码:
基于PHP和JS的AES相互加密解密方法详解(CryptoJS)
基于PHP和JS的AES相互加密解密方法详解(CryptoJS)
注意说明:
- 1. 首先引入CryptoJS包中的aes.js和pad-zeropadding.js
- 2. 其次引入了jquery.min.js和自己封装的function.js(内容主要是加密解密函数)
- 3. 加密解密过程中的向量和密钥必须保持一致
- 4. 进行加密的数据(字符串类型):{"username":"1001","password":"123456","terminal":"PC"}
- 5. 加密结果是变化的在这不写(变化的原因是因为密钥取得是当前时间)
- 6. 具体详情可读代码(注释完整)
加密测试:
- 进行加密的数据(字符串类型):{"username":"1001","password":"123456","terminal":"PC"}
解密测试:
-
进行解密密的数据(字符串类型、PHP端生成):2wOG4J5ziLXEYyHhnlJIQrdXb7kRe0hUg5yIUsGdaIvD07KCoUJ4XVy+8rGsYAc0fJ9AUvjuQMDNpxbTrNH3og==
- 解密的密钥(PHP端生成):
- JS解密后字符串:
* Date: 2018/2/27
* Time: 11:20
* Project: 基于PHP和JS的AES相互加密解密方法详解(CryptoJS)
* Power: php code
* ===============================================
*/
header("Content-type:text/html;charset=utf-8");
$ymd=date('Y-m-d',time());
//加密向量16位
$iv = "ZZWBKJ_ZHIHUAWEI";
//********************************解密**********************************
//js加密秘钥16位
$decrypt_key = date('Y-m-d',time())."eDu189";
//js加密密文字符串
$decrypt_data = "BZ6OGDF+0QogfZC8GNAl4HSMnjBFW5FtWhB3ZuZ5S9DD9KyhXskGF9FIfQHoGrTCVvBVsPfU4owHIHZ8y8RKew==";
$decrypted = decrypt($decrypt_data, $decrypt_key, $iv);
//解密结果
var_dump($decrypted);
//exit;
//********************************结束**********************************
//********************************加密**********************************
//PHP加密秘钥16位
$encrypt_key = date('Y-m-d',time())."cms39F";
//PHP加密数据
$arr = array('username' => '3333', 'password' => '123456', 'terminal' => 'PC');
//转换成json字符串
$encrypt_data = json_encode($arr);
$encrypted = encrypt($encrypt_data, $encrypt_key, $iv);
//加密结果
var_dump($encrypted);
exit;
//********************************结束**********************************
//******************************集成函数********************************
/**
* 加密字符串
* @param string $data 字符串
* @param string $key 加密key
* @param string $iv 加密向量
* @return string
*/
function encrypt($data, $key, $iv)
{
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
return base64_encode($encrypted);
}
/**
* 解密字符串
* @param string $data 字符串
* @param string $key 加密key
* @param string $iv 加密向量
* @return object
*/
function decrypt($data, $key, $iv)
{
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($data), MCRYPT_MODE_CBC, $iv);
$json_str = rtrim($decrypted, "\0");
return json_decode($json_str);
}