116 lines
3.9 KiB
JavaScript
116 lines
3.9 KiB
JavaScript
import aesjs from "aes-js";
|
|
import { Base64 } from "js-base64";
|
|
import { sm4 } from 'sm-crypto'
|
|
|
|
// const setting = useSettingStore();
|
|
// const message = useMessage();
|
|
|
|
// 生成密钥
|
|
const generateKey = function(setting) {
|
|
if(setting.activeFuction === "不加密"){
|
|
return ''
|
|
}
|
|
var charMap = ""
|
|
for(let i of setting.activeKeyMap){
|
|
if(i === 'A-Z'){
|
|
charMap = charMap + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
|
}else if(i === "a-z"){
|
|
charMap = charMap + 'abcdefghijklmnopqrstuvwxyz'
|
|
}else if(i === '0-9'){
|
|
charMap = charMap + '0123456789'
|
|
}
|
|
}
|
|
var returnStr = "",
|
|
length = setting.activeFuction !== "AES256" ? 16 : 32
|
|
// charMap = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
|
|
for (var i = 0; i < length; i++) {
|
|
var index = parseInt(Math.random() * charMap.length);
|
|
returnStr += charMap.substring(index, index + 1);
|
|
}
|
|
if(setting.activeFuction === "SM4"){
|
|
returnStr = 'SM4' + returnStr
|
|
}
|
|
// console.log(returnStr,returnStr.length)
|
|
return returnStr;
|
|
};
|
|
const blob2Uint8Array = function(blob) {
|
|
return new Promise((resolve, reject) => {
|
|
let reader = new FileReader();
|
|
reader.readAsArrayBuffer(blob);
|
|
reader.onload = function() {
|
|
let buffer = reader.result;
|
|
let uint8array = new Uint8Array(buffer);
|
|
resolve(uint8array);
|
|
};
|
|
reader.onerror = function() {
|
|
reject(reader.error);
|
|
};
|
|
});
|
|
};
|
|
|
|
|
|
const AES = (key,data)=>{
|
|
key = aesjs.utils.utf8.toBytes(key);
|
|
var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5));
|
|
var encryptedBytes = aesCtr.encrypt(data);
|
|
return encryptedBytes;
|
|
}
|
|
const SM4 = (key,data)=>{
|
|
// console.log(key)
|
|
var encryptedBytes = sm4.encrypt(data,key,{padding: 'pkcs#7',output:'array'});
|
|
// console.log(encryptedBytes, sm4.decrypt(encryptedBytes, key,{output:'array'}))
|
|
return new Uint8Array(encryptedBytes);
|
|
}
|
|
const encrypt = (key, data, fileName, setting, message) => {
|
|
// if(!encryptFunction){
|
|
// encryptFunction = setting.activeFuction
|
|
// }
|
|
let encryptFunction = {0:'不加密',16:'AES128',19:'SM4',32:'AES256'}[key.length]
|
|
return blob2Uint8Array(data).then(data => {
|
|
let encrypted_data = null
|
|
if(encryptFunction === "不加密"|| key === ''){
|
|
encrypted_data = data
|
|
// AES
|
|
}else if(encryptFunction != "SM4"){
|
|
message.info(`开始加密${fileName}`);
|
|
encrypted_data = AES(key,data)
|
|
message.info(`${fileName}加密完成`);
|
|
// SM4
|
|
}else{
|
|
message.info(`开始加密${fileName}`);
|
|
key = [...aesjs.utils.utf8.toBytes(key.substring(3))];
|
|
encrypted_data = SM4(key,data)
|
|
message.info(`${fileName}加密完成`);
|
|
}
|
|
return encrypted_data
|
|
});
|
|
};
|
|
|
|
// setting为pinia存储的setting。。。
|
|
const encryptString = (key, str, setting) => {
|
|
// if(!encryptFunction){
|
|
// encryptFunction = setting.activeFuction
|
|
// }
|
|
// console.log(key,key.length)
|
|
let encryptFunction = {0:'不加密',16:'AES128',19:'SM4',32:'AES256'}[key.length]
|
|
if(encryptFunction === "不加密" || key === ''){
|
|
// return sm4.encrypt(str, 'miaospringmiaospringmiaospringao')
|
|
return Base64.encode(str)
|
|
}else if(encryptFunction !== "SM4"){
|
|
key = aesjs.utils.utf8.toBytes(key);
|
|
// var data = aesjs.utils.utf8.toBytes(str);
|
|
var data = new TextEncoder().encode(str)
|
|
var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5));
|
|
var encryptedBytes = aesCtr.encrypt(data);
|
|
var res = Base64.fromUint8Array(encryptedBytes,true);
|
|
// console.log(encryptedBytes,res)
|
|
return res;
|
|
}else{
|
|
key = [...aesjs.utils.utf8.toBytes(key.substring(3))];
|
|
// console.log(key)
|
|
return sm4.encrypt(str, key)
|
|
}
|
|
};
|
|
|
|
export {encrypt,encryptString,generateKey} |