来源:https://blog.csdn.net/morninghapppy/article/details/79044026
案例:https://blog.csdn.net/zhihua_w/article/details/79388297?utm_source=copy
php 案例:https://blog.csdn.net/zhemejinnameyuanxc/article/details/83383434
注意!!!
由于前端的加密库关系,后端加密的“明钥”只能是16位的,但是如果你只是在后端使用或前端只是,没有前后交互,你就当我没说。
前端加密之后,后端解密出来的会有看不见的空白符,php 用trim($data)就可以了。
前端页面:
<!-- || ========================================================= || 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="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script> <script src="node_modules/crypto-js/crypto-js.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> /** * 接口数据加密函数 * @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 CryptoJS.enc.Utf8.stringify(decrypted); } </script> <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>
php:
<?php header("Content-type:text/html;charset=utf-8"); //加密向量16位 $iv = "ZZWBKJ_ZHIHUAWEI"; //********************************解密********************************** //js加密秘钥16位 $decrypt_key = "1572329129539WZH"; //js加密密文字符串 $decrypt_data = "SBItvk+il2X+b4A69xJNOIVN78Ty+G2fBfmQvEbtmw2jWWTMJ24lP21vm+mV0qCK13iAgQoiA/g4NCH/8iNZeA=="; $decrypted = openssl_decrypt($decrypt_data, \'AES-128-CBC\',$decrypt_key,OPENSSL_ZERO_PADDING, $iv); //解密结果 //echo $decrypted; //********************************结束********************************** //********************************加密********************************** $data = "你好"; $method = \'AES-128-CBC\';//加密方法 $result = openssl_encrypt($data, $method, $decrypt_key, 0,$iv); var_dump($result); $a = openssl_decrypt($result,$method,$decrypt_key,0,$iv); var_dump($a); //********************************结束**********************************
请发表评论