CBC加密:js实现与php互相加解密

前些日子搞的,参考了很多的文章,感谢各路大神,所以这里写上自己总结的代码。

1. JS部分

首先加载crypto-js插件,这个自己安装就行了,直接上工具代码

import * as CryptoJS from "crypto-js";
import { EncryptValEnum } from "@/enums/httpEnum";
import md5 from "md5";

/**
 * Aes加密
 * @param {String | object} str 待加密的字符串
 * @returns 加密后的字符串密文,base64编码格式
 */
export function EncryptByAes128(str: string | object) {
  const KEY = md5(EncryptValEnum.KEY);
  const IV = md5(EncryptValEnum.IV);
  const encryptedStr = CryptoJS.AES.encrypt(str, CryptoJS.enc.Utf8.parse(KEY.substring(0, 16)), {
    iv: CryptoJS.enc.Utf8.parse(IV.substring(0, 16)),
    mode: CryptoJS.mode.CBC
  });
  return encryptedStr.toString();
}

/**
 * Aes解密
 * @param {String | object} str 待解密的字符串,必须是base64格式编码的密文
 * @returns 返回utf8格式的解码明文
 */
export function DecryptByAes128(str: string | object) {
  const KEY = md5(EncryptValEnum.KEY);
  const IV = md5(EncryptValEnum.IV);
  const DecryptedStr = CryptoJS.AES.decrypt(str, CryptoJS.enc.Utf8.parse(KEY.substring(0, 16)), {
    iv: CryptoJS.enc.Utf8.parse(IV.substring(0, 16)),
    mode: CryptoJS.mode.CBC
  });
  return DecryptedStr.toString(CryptoJS.enc.Utf8);
}

二、PHP部分

使用openssl,记得要打开这个扩展,php7以上,7以内的自己网上搜

if (!function_exists('encryptByAes128')) {
    function encryptByAes128($data)
    {
		$key = substr(md5(config('aes128.key')), 0, 16);
        $iv = substr(md5(config('aes128.iv')), 0, 16);
        $encrypted = openssl_encrypt($data, "AES-128-CBC", $key, OPENSSL_RAW_DATA, $iv);
        return base64_encode($encrypted);
    }
}

if (!function_exists("decryptByAes128")) {
    /**
     * @param string $string
     * @param string $mode 具体见 openssl_get_cipher_methods()
     * @param int $len
     * @return string
     * @@author crablovery QQ/VX:503270743
     */
    function decryptByAes128($string, $mode = 'AES-128-CBC', $len = 32)
    {
        if (!$string) return '';
        $key = substr(md5(config('aes128.key')), 0, $len);
        $iv = substr(md5(config('aes128.iv')), 0, $len / 2);
        $data = openssl_decrypt($string, strtolower($mode), $key, 0, $iv);
        return trim($data);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值