vue Aes加解密實(shí)踐
更新時(shí)間:2026年05月05日 10:28:40 作者:酒醉的胡鐵
文章主要講述了在Vue項(xiàng)目中安裝并使用crypto-js進(jìn)行AES加解密的操作,提及了與RSA加密的不同,并提到因密鑰長度問題可能需要修改源碼,最后強(qiáng)調(diào)內(nèi)容為個(gè)人經(jīng)驗(yàn),僅供參考
vue Aes 加解密
安裝crypto-js
npm install crypto-js
微信小程序直接導(dǎo)入
const CryptoJS = require('../../common/crypto-js/crypto-js'); //引用AES源碼js
封裝
import CryptoJS from "crypto-js";
//32位密鑰
const keyStr = '16aef158550545688ae8ab0835aeb5dd';
//如果是16位密鑰則不需要下列操作
let key = CryptoJS.SHA1(CryptoJS.SHA1(keyStr)).toString().substring(0, 32);
let realKey = CryptoJS.enc.Hex.parse(key);
//偏移量 沒啥用 不太懂
const IV = '';
let tools = {
//加密
encrypt(word) {
let encrypted = CryptoJS.AES.encrypt(word, realKey, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
// 如果加密后的密文,需要16進(jìn)制返回的,使用
//return encrypted.ciphertext.toString()
// 如果加密后的密文,使用的是base64格式的, 使用直接使用
//return encrypted.toString()
return encrypted.ciphertext.toString();
},
//解密
decrypt(word) {
// 將16進(jìn)制 轉(zhuǎn)換為Base64字符串
var contentHexStr = CryptoJS.enc.Hex.parse(word);
var srcs = CryptoJS.enc.Base64.stringify(contentHexStr);
let decrypt = CryptoJS.AES.decrypt(srcs, realKey, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return CryptoJS.enc.Utf8.stringify(decrypt).toString();
}
};
export default tools;
調(diào)用
import tools from '../../common/js/utils/crypto-js';
let a = tools.encrypt("{\"fLoyaltyId\":\"7004900004135957810\",\"signType\":\"0\"}");
let b = tools.decrypt(a);
后端工具類
package com.lf.gas_platform.common.utils;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
/*
* AES對(duì)稱加密和解密
*/
public class AESUtil {
public static byte[] encrypt(String content, String password) {
try {
KeyGenerator kgen = KeyGenerator.getInstance( "AES" );
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );
secureRandom.setSeed(password.getBytes());
kgen.init(128,secureRandom);
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");
byte[] byteContent = content.getBytes("utf-8");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] result = cipher.doFinal(byteContent);
return result;
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}
/**
* 解密AES加密過的字符串
*
* @param content
* AES加密過過的內(nèi)容
* @param password
* 加密時(shí)的密碼
* @return 明文
*/
public static byte[] decrypt(byte[] content, String password) {
try {
KeyGenerator kgen = KeyGenerator.getInstance( "AES" );
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );
secureRandom.setSeed(password.getBytes());
kgen.init(128,secureRandom);
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] result = cipher.doFinal(content);
return result;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}
/**將二進(jìn)制轉(zhuǎn)換成16進(jìn)制
* @param buf
* @return
*/
public static String parseByte2HexStr(byte buf[]) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
}
/**將16進(jìn)制轉(zhuǎn)換為二進(jìn)制
* @param hexStr
* @return
*/
public static byte[] parseHexStr2Byte(String hexStr) {
if (hexStr.length() < 1)
return null;
byte[] result = new byte[hexStr.length()/2];
for (int i = 0;i< hexStr.length()/2; i++) {
int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
result[i] = (byte) (high * 16 + low);
}
return result;
}
public static String AesEncryption(String data, String password){
byte[] shellEncrypt = encrypt(data, password);
return parseByte2HexStr(shellEncrypt);
}
public static String AesDecrypt(String data, String password){
byte[] twoStrResult = parseHexStr2Byte(data);
byte[] decrypt = decrypt(twoStrResult, password);
return new String(decrypt);
}
public static void main(String[] args) throws Exception {
String password = "26c7fa1b46babbda88d3b977de122c1c";
String content = "123";
System.out.println("加密之前:" + content);
// 加密
byte[] encrypt = encrypt(content, password);
System.out.println("加密后的內(nèi)容:" + new String(encrypt,"UTF-8"));
String hexStrResult = parseByte2HexStr(encrypt);
System.out.println("16進(jìn)制的密文:" + hexStrResult);
// 解密data=
// String hexStrResult="B4631447A3358131A0B8AC229CA30E874BBC75B0C5CB51E363AFCB9489BC6A89E3AD4581F0B446CFD91AC253494452F55AD6D64E3C33E5C7456347B3D50C98059ED33DFF17E12DD4F6CA3F8443550A8E29942656A4046D5F7B0D4AFE66BA1E18C240DDB57683741C21152AD93164D70AA4DF1E34F5A83E4A0A1D1164EF6315E800306811BA2B0F170E2A953347A2C0DD1D9C7074CA6B4B08F1C5C0F956711685BF073C3ADCEB2301DF4D27CD74FB8C24FBCF451057BB1666DC620B7A83B366A0130A84205C63C8EC0963BCBCAD0B1D6F";
// String password = "27c8fa1a46baabda88d2b977de272c1f";
byte[] twoStrResult = parseHexStr2Byte(hexStrResult);
byte[] decrypt = decrypt(twoStrResult, password);
System.out.println("解密后的內(nèi)容:" + new String(decrypt));
}
}
這個(gè)是RSA加密跟上面的AES沒關(guān)系,密鑰長度過長可能需要 修改加密的源碼 下面是已經(jīng)修改好的
<template>
<view>
</view>
</template>
<script>
import JSEncrypt from './jsencrypt.min.js';
export default {
data() {
return {
}
},
methods: {
},
encryptUnicodeLong: function(publicKey, string) {
const encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
var k = encrypt.getKey();
//根據(jù)key所能編碼的最大長度來定分段長度。key size - 11:11字節(jié)隨機(jī)padding使每次加密結(jié)果都不同。
var maxLength = ((k.n.bitLength() + 7) >> 3) - 11;
try {
var subStr = "",
encryptedString = "";
var subStart = 0,
subEnd = 0;
var bitLen = 0,
tmpPoint = 0;
for (var i = 0, len = string.length; i < len; i++) {
//js 是使用 Unicode 編碼的,每個(gè)字符所占用的字節(jié)數(shù)不同
var charCode = string.charCodeAt(i);
if (charCode <= 0x007f) {
bitLen += 1;
} else if (charCode <= 0x07ff) {
bitLen += 2;
} else if (charCode <= 0xffff) {
bitLen += 3;
} else {
bitLen += 4;
}
//字節(jié)數(shù)到達(dá)上限,獲取子字符串加密并追加到總字符串后。更新下一個(gè)字符串起始位置及字節(jié)計(jì)算。
if (bitLen > maxLength) {
subStr = string.substring(subStart, subEnd)
encryptedString += encrypt.encrypt(subStr);
subStart = subEnd;
bitLen = bitLen - tmpPoint;
} else {
subEnd = i;
tmpPoint = bitLen;
}
}
subStr = string.substring(subStart, len)
encryptedString += encrypt.encrypt(subStr);
return encryptedString;
} catch (ex) {
return false;
}
},
getRealLen: function(str) {
return str.replace(/[^\x00-\xff]/g, '__').length;
},
setEncryptList: function(publicKey, str, max) {
var arr = []
var s = str,
reg = /.{40}/g,
ppstr = s.match(reg);
ppstr.push(s.substring(ppstr.join('').length));
for (var nux = 0; nux < ppstr.length; nux++) {
var Nax = this.getRealLen(ppstr[nux]);
if (Nax > 116) {
var list = this.setEncryptList(publicKey, ppstr[nux], Nax)
for (var nu = 0; nu < list.length; nu++) {
arr.push(list[nu]);
}
} else {
arr.push(this.setEncrypt(publicKey, ppstr[nux]));
}
}
return arr;
},
setEncrypt: function(publicKey, data) {
const encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
return encrypt.encrypt(data);
},
setLongEncrypt: function(publicKey, data) {
// debugger;
// if(data.length > 117){
// return setEncrypt(publicKey,data)
// }
var s = data,
reg = /.{116}/g,
rs = s.match(reg);
if (rs === null) {
console.log(data, '進(jìn)入短加密')
return this.setEncrypt(publicKey, data)
}
// debugger;
rs.push(s.substring(rs.join('').length));
var arr = [];
for (var n = 0; n < rs.length; n++) {
var max = this.getRealLen(rs[n]);
if (max > 116) {
var list = this.setEncryptList(publicKey, rs[n], max)
for (var nu = 0; nu < list.length; nu++) {
arr.push(list[nu]);
}
} else {
arr.push(this.setEncrypt(publicKey, rs[n]));
}
}
return arr;
},
setDecryptArray: function(PrivateKey, ArrayData) {
var Decrypt = "";
for (var n = 0; n < ArrayData.length; n++) {
Decrypt = Decrypt + this.setDecrypt(PrivateKey, ArrayData[n]);
}
return Decrypt;
},
setDecrypt: function(PrivateKey, data) {
const encrypt = new JSEncrypt();
encrypt.setPrivateKey(PrivateKey);
return encrypt.decrypt(data);
}
}
</script>
<style>
</style>
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue elementUI select下拉框如何設(shè)置默認(rèn)值
這篇文章主要介紹了vue elementUI select下拉框如何設(shè)置默認(rèn)值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
Vue利用openlayers實(shí)現(xiàn)點(diǎn)擊彈窗的方法詳解
點(diǎn)擊彈窗其實(shí)就是添加一個(gè)彈窗圖層,然后在點(diǎn)擊的時(shí)候讓他顯示出來罷了。本文將利用openlayers實(shí)現(xiàn)這一效果,快跟隨小編一起學(xué)習(xí)一下吧2022-06-06
vue路由組件路徑如何用變量形式動(dòng)態(tài)引入
這篇文章主要介紹了vue路由組件路徑如何用變量形式動(dòng)態(tài)引入問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
vue.js內(nèi)置組件之keep-alive組件使用
keep-alive是Vue.js的一個(gè)內(nèi)置組件。這篇文章主要介紹了vue.js內(nèi)置組件之keep-alive組件使用,需要的朋友可以參考下2018-07-07
解決找不到模塊“xxx.vue”或其相應(yīng)的類型聲明問題
這篇文章主要介紹了解決找不到模塊“xxx.vue”或其相應(yīng)的類型聲明問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2022-10-10

