aes加密兼容前后端的方法

2019-09-29  本文已影响0人  江江简书
前言:最近在写移动端的接口,之前用过加密传输的方式都在前端的,因此之前文章写的是rsa加密,但是由于涉及前端所以换成aes因为aes是双向加密解密而rsa是单向解密的所以。。。。
前端js的写法
<!DOCTYPE html>
<html>
<head>
    <title>es6</title>
</head>
<body>
</body>
<script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.min.js"></script>
<script type="text/javascript">
     /**
     * @descript加密
     * @param data
     * @returns {string}
     */
        function encrypt(data) {
            let text = JSON.stringify(data);
            text = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(text)).toString();
            let key = CryptoJS.enc.Utf8.parse('!@$#%$^%&%^&~-=z'); //为了避免补位,直接用16位的秘钥
            let iv = CryptoJS.enc.Utf8.parse('!@$#%$^%&%^&~-=z'); //16位初始向量
            let encrypted = CryptoJS.AES.encrypt(text, key, {
                iv: iv,
                mode: CryptoJS.mode.CBC,
                padding: CryptoJS.pad.ZeroPadding
            }).toString();
            return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(encrypted)).toString();
        }
        
        /**
         * @descript解密
         * @param data
         * @returns {string}
         */
        function decrypt(data) {
            let encrypted = CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(data)).toString();
            let key = CryptoJS.enc.Utf8.parse('1234567812345678'); //为了避免补位,直接用16位的秘钥
            let iv = CryptoJS.enc.Utf8.parse('1234567812345678'); //16位初始向量
            let decrypted = CryptoJS.AES.decrypt(encrypted, key, {
                iv: iv,
                mode: CryptoJS.mode.CBC,
                padding: CryptoJS.pad.ZeroPadding
            }).toString(CryptoJS.enc.Utf8);
            return CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(decrypted)).toString();
        }

         let data = {"username1": "admin2", "pwd1": "passwd2"};
         let encrypt_data = encrypt(data);
         console.log(encrypt_data);
        let decrypt_data = decrypt(encrypt_data)
         console.log(decrypt_data);
</script>
</html>
php7.1^的加密方法
/**
 * @param $data
 * @return int|mixed
 */
function encrypt($data)
{
    $key = config('aes_key');//秘钥必须为:8/16/32位
    $iv = config('aes_key');
    $base64_str = base64_encode(json_encode($data));
    $encrypted = openssl_encrypt($base64_str, "aes-128-cbc", $key, OPENSSL_ZERO_PADDING, $iv);
    return base64_encode($encrypted);
}

/**
 * @param $data
 * @return int|mixed
 */
function decrypt($data)
{
    $encrypted = base64_decode($data);
    $key = config('aes_key');//秘钥必须为:8/16/32位
    $iv = config('aes_key');
    $decrypted = openssl_decrypt($encrypted, 'aes-128-cbc', $key, OPENSSL_ZERO_PADDING, $iv);
    return json_decode(base64_decode($decrypted), true);
}
$et = encrypt(['username'=>'admin','pwd'=>'admin']);//这里有一个诡异的问题如果key为token是无法加密换成其它key是可以
上一篇 下一篇

猜你喜欢

热点阅读