js前端加密,php后端解密(crypto-js,openssl_decrypt)


來源: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 <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="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);


//********************************結束**********************************

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM