crypto-js与php通过aes加密传输

CryptoJS (crypto.js) 为 JavaScript 提供了各种各样的加密算法。目前已支持的算法包括:

  • MD5
  • SHA-1
  • SHA-256
  • AES
    ….
    这里我们演示aes对称加密数据传输,下面列出crypto-js的几个重要链接

github项目地址
https://github.com/brix/crypto-js
文档
https://github.com/brix/crypto-js/blob/master/docs/QuickStartGuide.wiki
源码地址
https://github.com/brix/crypto-js/releases

js前端演示代码:

<script src="./crypto-js-3.1.9-1/crypto-js.js"></script>
<script type="text/javascript">

    /**加密
    *
    * @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('1234567887654321'); //为了避免补位,直接用16位的秘钥
        let iv = CryptoJS.enc.Utf8.parse('1234567887654321'); //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();
    }
    
    /**解密
    *
    * @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('1234567887654321'); //为了避免补位,直接用16位的秘钥
        let iv = CryptoJS.enc.Utf8.parse('1234567887654321'); //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 = {"username": "admin", "pwd": "passwd"};
    let encrypt_data = encrypt(data);
    let decrypt_data = decrypt(encrypt_data);
    console.log(decrypt_data);
</script>

php后端演示代码:

/**加密
* @param $data
* @return string
*/
function encrypt($data)
{
    $key = "1234567887654321";//秘钥必须为:8/16/32位
    $iv = "1234567887654321";
    $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 mixed
*/
function decrypt($data)
{
    $encrypted = base64_decode($data);
    $key = "1234567887654321";//秘钥必须为:8/16/32位
    $iv = "1234567887654321";
    $decrypted = openssl_decrypt($encrypted, 'aes-128-cbc', $key, OPENSSL_ZERO_PADDING, $iv);
    return json_decode(base64_decode($decrypted), true);
}

$data = ['username'=>'admin','pwd'=>'admin'];  
$encrypt=encrypt($data);
$str=decrypt($encrypt);
var_dump($str);

参考:https://www.jianshu.com/p/5619d68bc2d1

小刘

纸上得来终觉浅,绝知此事要躬行

你可能也会喜欢...

发表评论

电子邮件地址不会被公开。 必填项已用*标注