zoukankan      html  css  js  c++  java
  • 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);
    
    
    //********************************结束**********************************
  • 相关阅读:
    【剑指offer】24.反转链表
    【剑指offer】22. 链表中倒数第k个节点
    【每日一题-leetcode】84.柱状图中最大的矩形
    activity切换动画
    取消ActionBar的方法
    软工概论学习一
    软工概论学习二
    屏幕滑动监测以及触发事件
    Android 动画解释
    shape 学习
  • 原文地址:https://www.cnblogs.com/laijinquan/p/11592403.html
Copyright © 2011-2022 走看看