uniapp 与thinkphp AES加密和解密

前端采用的uniapp框架Vue3版本:
1.安装crypto-js 使用npm命令 ;版本为:^3.3.0

npm install crypto-js@^3.3.0

然后再utisl目录下新建一个加密与解密的公共工具文件:

//一般向量是需要随机的生成的但是为了方便我这边直接用了一个自定义的
import CryptoJS from 'crypto-js';
const crypt_key = 'i4ua32wx6mqmyc9n'; //密钥,需要和后端保持一致长度为16位 
const crypt_iv = 'o3y8xto2nzfjng1d'; //偏移向量,需要和后端保持一致长度为16位
export default {
	//加密
	myencrypt(str) {
		let aes_key = CryptoJS.enc.Utf8.parse(crypt_key);
		// 将iv解析为字节
		let new_iv = CryptoJS.enc.Utf8.parse(crypt_iv);
		// AES加密 CBC模式 ZeroPadding
		let encrypted = CryptoJS.AES.encrypt(str, aes_key, {
			iv: new_iv,
			mode: CryptoJS.mode.CBC,
			padding: CryptoJS.pad.Pkcs7
		});
		// 返回字符串
		return encrypted.toString();
	},
	//解密
	mydecrypt(str) {
		let aes_key = CryptoJS.enc.Utf8.parse(crypt_key);
		let aes_iv = CryptoJS.enc.Utf8.parse(crypt_iv);
		// 将数据编码成Base64格式
		let baseResult = CryptoJS.enc.Base64.parse(str);
		let ciphertext = CryptoJS.enc.Base64.stringify(baseResult);
		// AES解密 CBC模式 ZeroPadding
		let decryptResult = CryptoJS.AES.decrypt(ciphertext, aes_key, {
			iv: aes_iv,
			mode: CryptoJS.mode.CBC,
			padding: CryptoJS.pad.Pkcs7
		});
		// 返回字符串
		let resData = decryptResult.toString(CryptoJS.enc.Utf8).toString();
		return resData;

	}
}

//调用示例

import cryptoUtil from '@/utils/crypto.js';
/let waitEncryotStr = {
		id: '1234567890',
		name: '张三',
		age: 18,
		sex: '男'
	};
	waitEncryotStr = JSON.stringify(waitEncryotStr);
	const cryptoStr = cryptoUtil.myencrypt(waitEncryotStr);
	console.log('加密', cryptoStr);
	const decryptStr = cryptoUtil.mydecrypt( cryptoStr );
	console.log('解密', JSON.parse(decryptStr));

``
在php后端common.php中新建两个函数用于加密和解密

```php
/* 
 ** AES加密  CryptoJS.mode.CBC
 * @param string $data 要加密的字符串
 * @param string $key  加密密钥
 * @param string $iv   加密向量
*/
if (!function_exists('myencrypt')) {
    function myencrypt($data, $key='与前端约定的key', $iv='与前端约定的iv'){
        $encrypted = openssl_encrypt($data, "AES-128-CBC", $key, true, $iv);
       return base64_encode($encrypted);
    }
    
}
/*
 ** AES解密  CryptoJS.mode.CBC
 * @param string $data 要解密的字符串
 * @param string $key  解密密钥
 * @param string $iv   解密向量
 * @return string
 * */
if (!function_exists('mydecrypt')) {
    function mydecrypt($data,$key='与前端约定的key', $iv='与前端约定的iv'){
        $encrypted = base64_decode($data);
        return openssl_decrypt($encrypted, "AES-128-CBC", $key, true, $iv);   
             
    } 
}

后端使用实例:

public function testdecrypt(){
        $post= $this->request->post();
        $decryptData= mydecrypt($post['data']);
        $waitjiami=[
            'id'=>'11',
            'name'=>'你好特朗普',
            'timestamp'=>time(),
            'sign'=>1234567890
        ];
        return myjsonshow(200,'success',[
            'jiemidata'=>$decryptData,
            'post'=>$post,
            'jiamidata'=>myencrypt(json_encode($waitjiami))
        ]);       
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值