前端采用的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))
]);
}