基于PHP和JS的AES相互加密解密方法详解
原地址 :https://blog.****.net/zhihua_w/article/details/79388297
下载地址:https://download.****.net/download/weixin_38615720/10908675
在最近的项目中,前端后台数据交互需要进行加密之后传输使用,以保证系统数据的安全。有关数据加密解密的问题,有很多种加密的方式,在这里我选择了AES的加密方式。特此写下此篇博文,总结讲述下PHP和JS进行相互AES加密解密的方法。
HTML(index.html)代码
<!--
|| =========================================================
|| Created by ZHIHUA·WEI.
|| Author: ZHIHUA·WEI <[email protected]>
|| Date: 2018/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 = '20180227110419WB';
//解密密文字符串
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 <[email protected]>
* Date: 2018/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);
}
index.php页面:
<?php
/**
* ===============================================
* Created by ZHIHUA·WEI.
* Author: ZHIHUA·WEI <[email protected]>
* Date: 2018/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);
}
---------------------
作者:Zhihua_W
来源:****
原文:https://blog.****.net/zhihua_w/article/details/79388297
版权声明:本文为博主原创文章,转载请附上博文链接!