vue sm2 加密解密 pako解压 笔记

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));
}


猜你喜欢

转载自blog.csdn.net/qq_38388578/article/details/131126116
今日推荐