基于PHP和JS的AES相互加密解密方法详解(CryptoJS)

244 篇文章 3 订阅
128 篇文章 1 订阅

在最近的项目中,前端后台数据交互需要进行加密之后传输使用,以保证系统数据的安全。有关数据加密解密的问题,有很多种加密的方式,在这里我选择了AES的加密方式。特此写下此篇博文,总结讲述下PHP和JS进行相互AES加密解密的方法。

        关于源代码点击地址进行下载:http://download.csdn.net/download/zhihua_w/10261363

--------------------- 本文来自 Zhihua_W 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/zhihua_w/article/details/79388297?utm_source=copy

 

一、控制器 加密与解密公共函数

/** 
* 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;

 

二、HTML(index.html)代码

下面是修改过的代码:

<!--
 || =========================================================
 || Created by ZHIHUA·WEI.
 || Author: ZHIHUA·WEI <zhihua_wei@foxmail.com>
 || 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端生成):2wOG4J5ziLXEYyHhnlJIQrdXb7kRe0hUg5yIUsGdaIvD07KCoUJ4XVy+8rGsYAc0fJ9AUvjuQMDNpxbTrNH3og==
        </li>
        <li id="decrypt_key">解密的密钥(PHP端生成):</li>
        <li id="decrypt_string">JS解密后字符串:</li>
    </ul>
</div>
<script>
	//生成时间yyyymmdd
		 var nowDate = new Date();
		 var year = nowDate.getFullYear();
		 var month = nowDate.getMonth() + 1 < 10 ? "0" + (nowDate.getMonth() + 1)
		  : nowDate.getMonth() + 1;
		 var day = nowDate.getDate() < 10 ? "0" + nowDate.getDate() : nowDate.getDate();
		 var dateStr = year + "-" + month + "-" + day;

	console.log(dateStr);
	
    //********************************加密**********************************
    //获取当前时间戳13位 + 3位字符
    //var timestamp = dateStr + "WZH";
    //加密密钥16位
    var encrypt_key = dateStr+"eDu189";
    //加密向量16位
    var iv = 'ZZWBKJ_ZHIHUAWEI';
    //要加密的数据
    var encrypt_string = '{"username":"15551","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 =  dateStr+'cms39F';
    //解密密文字符串
    var decrypt_string = "s0zisDzQj2QnY/bxdaAJVi10IeBA0B/ghppjBpJ94ZLLGIbmJDCHoP4ribJjBHC4REgpYiaoS3195vSDsPVo6w==";
    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)代码

<?php
/**
 * ===============================================
 * Created by ZHIHUA·WEI.
 * Author: ZHIHUA·WEI <zhihua_wei@foxmail.com>
 * 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);
}

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值