在最近的项目中,前端后台数据交互需要进行加密之后传输使用,以保证系统数据的安全。有关数据加密解密的问题,有很多种加密的方式,在这里我选择了AES的加密方式。特此写下此篇博文,总结讲述下PHP和JS进行相互AES加密解密的方法。
关于源代码点击地址进行下载:/download/zhihua_w/10261363
HTML(index.html)代码
<!--|| =========================================================|| Created by ZHIHUA·WEI.|| Author: ZHIHUA·WEI <zhihua_wei@>|| Date: /2/27|| Time: 10:16|| Project: 基于PHP和JS的AES相互加密解密方法详解(CryptoJS)|| Power: index.html|| =========================================================--><!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="keywords" content="ZHIHUA·WEI,基于PHP和JS的AES相互加密解密方法详解,AES加密解密"><meta name="description" content="基于PHP和JS的AES相互加密解密方法详解,AES加密解密,PHP开发,ZHIHUA· WEI"><meta name="author" content="ZHIHUA·WEI"><meta name="version" content="1.0.0"><title>基于PHP和JS的AES相互加密解密方法详解(CryptoJS)</title><script src="./rollups/aes.js"></script><script src="./components/pad-zeropadding.js"></script><script src="./jquery.min.js"></script><script src="./function.js"></script></head><body><div style="margin: 0;text-align:center;"><h2>基于PHP和JS的AES相互加密解密方法详解(CryptoJS)</h2></div><div style="margin:0 18%;"><h4>注意说明:</h4><ul><li>1. 首先引入CryptoJS包中的aes.js和pad-zeropadding.js</li><li>2. 其次引入了jquery.min.js和自己封装的function.js(内容主要是加密解密函数)</li><li>3. 加密解密过程中的向量和密钥必须保持一致</li><li>4. 进行加密的数据(字符串类型):{"username":"1001","password":"123456","terminal":"PC"}</li><li>5. 加密结果是变化的在这不写(变化的原因是因为密钥取得是当前时间)</li><li>6. 具体详情可读代码(注释完整)</li></ul></div><div style="margin:0 18%;"><h4>加密测试:</h4><ul><li>进行加密的数据(字符串类型):{"username":"1001","password":"123456","terminal":"PC"}</li><li id="encrypt_key"></li><li id="encrypt_string"></li></ul></div><div style="margin:0 18%;"><h4>解密测试:</h4><ul><li>进行解密密的数据(字符串类型、PHP端生成):8bkd/doBOrG3+pTEGkRwk9A3ZLrzXtf10E6Nn9CSoHXRXHydM7xt7PllPhUSItuK8ciF5g6UZ7DruCPQCVNZIJzI4ZHyUMJlV2aHyqMhbEoyS3pK6lPs1MsOeU/H7BZ5</li><li id="decrypt_key">解密的密钥(PHP端生成):</li><li id="decrypt_string">JS解密后字符串:</li></ul></div><script>//********************************加密**********************************//获取当前时间戳13位 + 3位字符var timestamp = new Date().getTime().toString() + "WZH";//加密密钥16位var encrypt_key = timestamp;//加密向量16位var iv = 'ZZWBKJ_ZHIHUAWEI';//要加密的数据var encrypt_string = '{"username":"1001","password":"123456","terminal":"PC"}';//加密后密文(加密函数在function.js文件中)var encrypted_string = encrypt(encrypt_string, encrypt_key, iv);$("#encrypt_key").text("JS加密密钥:" + encrypt_key);$("#encrypt_string").text("JS加密后字符串:" + encrypted_string);//********************************结束**********************************//********************************解密**********************************//解密密钥16位(解密向量同上)var decrypt_key = '0227110419WB';//解密密文字符串var decrypt_string = "8bkd/doBOrG3+pTEGkRwk9A3ZLrzXtf10E6Nn9CSoHXRXHydM7xt7PllPhUSItuK8ciF5g6UZ7DruCPQCVNZIJzI4ZHyUMJlV2aHyqMhbEoyS3pK6lPs1MsOeU/H7BZ5";var decrypted_string = decrypt(decrypt_string, decrypt_key, iv);$("#decrypt_key").text("解密的密钥(PHP端生成):" + decrypt_key);$("#decrypt_string").text("JS解密后字符串:" + decrypted_string);//********************************结束**********************************</script></body></html>
界面效果
JS(funciton.js)代码
/*** ===============================================* Created by ZHIHUA·WEI.* Author: ZHIHUA·WEI <zhihua_wei@>* Date: /2/27* Time: 10:20* Project: 基于PHP和JS的AES相互加密解密方法详解(CryptoJS)* Power: Javascript common function* ===============================================*//*** 接口数据加密函数* @param str string 需加密的json字符串* @param key string 加密key(16位)* @param iv string 加密向量(16位)* @return string 加密密文字符串*/function encrypt(str, key, iv) {//密钥16位var key = CryptoJS.enc.Utf8.parse(key);//加密向量16位var iv = CryptoJS.enc.Utf8.parse(iv);var encrypted = CryptoJS.AES.encrypt(str, key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.ZeroPadding});return encrypted;}/*** 接口数据解密函数* @param str string 已加密密文* @param key string 加密key(16位)* @param iv string 加密向量(16位)* @returns {*|string} 解密之后的json字符串*/function decrypt(str, key, iv) {//密钥16位var key = CryptoJS.enc.Utf8.parse(key);//加密向量16位var iv = CryptoJS.enc.Utf8.parse(iv);var decrypted = CryptoJS.AES.decrypt(str, key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.ZeroPadding});return decrypted.toString(CryptoJS.enc.Utf8);}
PHP(index.php)代码
<?php/*** ===============================================* Created by ZHIHUA·WEI.* Author: ZHIHUA·WEI <zhihua_wei@>* Date: /2/27* Time: 11:20* Project: 基于PHP和JS的AES相互加密解密方法详解(CryptoJS)* Power: php code* ===============================================*/header("Content-type:text/html;charset=utf-8");//加密向量16位$iv = "ZZWBKJ_ZHIHUAWEI";//********************************解密**********************************//js加密秘钥16位$decrypt_key = "1519699179001WZH";//js加密密文字符串$decrypt_data = "ngX3VuJ+b2dBmfMEk4+Q8eVGNnWeidwMZltHn78g4b8sn1i7Di8LPeNnQNQmY525LxADvJKIEpv2Vzs0w9fdlw==";$decrypted = decrypt($decrypt_data, $decrypt_key, $iv);//解密结果var_dump($decrypted);//exit;//********************************结束**********************************//********************************加密**********************************//PHP加密秘钥16位$encrypt_key = date("YmdHis") . "WB";//PHP加密数据$arr = array('username' => '1001', '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);}