PHP与JS互相加密解密

:在使用PHP这两个函数时切记一定要打开 openssl 扩展(如果你是宝塔面板用户就不用管了,默认是开启了的),另外还需引入核心 crypto-js 文件,否则JS部分会报错无法使用。

PHP部分代码

/**
 * 加密字符串
 * $data 字符串
 * $key 加密key(16位)
 * $iv 加密向量(16位)
 * return string
 */
function encrypt($data, $key, $iv) {
    $encrypted = openssl_encrypt($data, "AES-128-CBC", $key, true, $iv);
    return base64_encode($encrypted);
}

/**
 * 解密字符串
 * return object
 */
function decrypt($data, $key, $iv) {
    $decrypted = openssl_decrypt(base64_decode($data), "AES-128-CBC", $key, true, $iv);
    $json_str = rtrim($decrypted, "\0");
    return json_decode($json_str);
}

JS部分代码

/**
 * 接口数据加密函数
 * str 需加密的字符串
 * key 加密key(16位)
 * iv 加密向量(16位)
 * return string 加密密文字符串
 */
function encrypt(str, key, iv) {
    var key = CryptoJS.enc.Utf8.parse(key);
    var iv = CryptoJS.enc.Utf8.parse(iv);
    var encrypted = CryptoJS.AES.encrypt(str, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    return encrypted;
}

/**
 * 接口数据解密函数
 * returns {*|string} 解密之后的字符串
 */
function decrypt(str, key, iv) {
    var key = CryptoJS.enc.Utf8.parse(key);
    var iv = CryptoJS.enc.Utf8.parse(iv);
    var decrypted = CryptoJS.AES.decrypt(str, key, {
        iv: iv,
        padding: CryptoJS.pad.Pkcs7
    }).toString(CryptoJS.enc.Utf8);
    return decrypted;
}

实现方法、演示

这里演示一下PHP写入加密cookie、JS读取并解密

PHP部分

/**
 * 加密字符串
 * $data 字符串
 * $key 加密key(16位)
 * $iv 加密向量(16位)
 * return string
 */
function encrypt($data, $key, $iv) {
    $encrypted = openssl_encrypt($data, "AES-128-CBC", $key, true, $iv);
    return base64_encode($encrypted);
}

$name = "mc"; //cookie名称
$data = "你好世界"; //要加密的字符串
$key = "f1hjd63id76d74j8"; //加密key(16位)
$iv = "k37f8h5y7sk37vh4"; //加密向量(16位)
$expire = time()+3600; //时间戳,秒数,cookie的过期时间
setcookie($name, encrypt($data, $key, $iv), $expire); // PHP写入加密cookie

JS部分

//js 获取 php 设置的 Cookie
getck = function(name) {
    var arr = document.cookie.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)"));
    if (arr != null) {
        return decodeURIComponent(arr[2]);
    }
    return null;
};

/* js 获取 php 设置的 Cookie(第二种方法)
getck = function(c_name) {
    if (document.cookie.length > 0){
        c_start = document.cookie.indexOf(c_name + "=");
        if (c_start != -1){
            c_start = c_start + c_name.length + 1;
            c_end = document.cookie.indexOf(";", c_start);
            if (c_end == -1){
                c_end = document.cookie.length;
            }
            return unescape(document.cookie.substring(c_start, c_end));
        }
    }
    return "";
};*/

/**
 * 接口数据解密函数
 * str 需加密的字符串
 * key 加密key(16位)
 * iv 加密向量(16位)
 * returns {*|string} 解密之后的字符串
 */
function decrypt(str, key, iv) {
    var key = CryptoJS.enc.Utf8.parse(key);
    var iv = CryptoJS.enc.Utf8.parse(iv);
    var decrypted = CryptoJS.AES.decrypt(str, key, {
        iv: iv,
        padding: CryptoJS.pad.Pkcs7
    }).toString(CryptoJS.enc.Utf8);
    return decrypted;
}

data = getck("mc"); //读取要解密的cookie并赋值给data,mc 为cookie名称
key = "f1hjd63id76d74j8"; //加密key(16位)
iv = "k37f8h5y7sk37vh4"; //加密向量(16位)
jmh_data = decrypt(data, key, iv); //JS解密 PHP写入的加密cookie,并赋值给jmh_data

其他

部分内容引用:

最后修改:2022 年 10 月 10 日
如果觉得我的文章对你有用,请随意赞赏