1. 程式人生 > >基於PHP和JS的AES相互加密解密方法詳解

基於PHP和JS的AES相互加密解密方法詳解

原地址 :https://blog.csdn.net/zhihua_w/article/details/79388297

下載地址:https://download.csdn.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 
來源:CSDN 
原文:https://blog.csdn.net/zhihua_w/article/details/79388297 
版權宣告:本文為博主原創文章,轉載請附上博文連結!