utils/ crypto.js
import { sm2 } from 'sm-crypto';
import { Base64 } from 'js-base64';
import {PUBLICKEY,PRIVATEKEY} from './key.js'
import pako from 'pako'
//加密
export function doEncrypt(msgString) {
let msg = msgString
if (typeof msgString !== 'string') {
msg = JSON.stringify(msgString)
}
// console.log(msg,'加密前')
// 1 - C1C3C2; 0 - C1C2C3; 默认为1
let cipherMode = 0
let publicKey = PUBLICKEY
// 加密结果
let encryptData = sm2.doEncrypt(msg, publicKey, cipherMode)
//Base64编码 自行选择是否使用
//let baseEncode = Base64.encode(encryptData)
// 加密后的密文前需要添加04,后端才能正常解密 (不添加04,后端处理也可以)
let encrypt = '04' + encryptData
return encrypt
}
// 解密
export function doDecryptStr(enStr) {
const byte = (x) => ((((x | 0) & 0xff) + 128) % 256) - 128;
// let msg=enStr
if (typeof enStr !== 'string') {
enStr = JSON.stringify(enStr)
}
// 1 - C1C3C2; 0 - C1C2C3; 默认为1
let cipherMode = 0
let privateKey = PRIVATEKEY
let enval = enStr.substring(2)
// 解密结果
let doDecrypt = sm2.doDecrypt(enval, privateKey, cipherMode, {
output: 'array'
});
for (let i = 0; i < doDecrypt.length; i++) {
doDecrypt[i] = byte(doDecrypt[i]);
}
let unzipStr = unzip(doDecrypt);
console.log(unzipStr)
// 解密后类型转换
let objData = JSON.parse(unzipStr)
console.log(objData, 'objData')
return objData
}
//js解压gzip
function unzip(binData) {
let unit = new Uint8Array(binData)
// 解压
var data = pako.inflate(unit);
// key = String.fromCharCode.apply(null, new Uint16Array(data));
var res = '';
var chunk = 16 * 1024;
var i;
for (i = 0; i < data.length / chunk; i++) {
res += String.fromCharCode.apply(null, data.slice(i * chunk, (i + 1) * chunk));
}
res += String.fromCharCode.apply(null, data.slice(i * chunk));
// 将GunZip ByTAREAR转换回ASCII字符串
return decodeURIComponent(escape(res));
}