SMEncryt.ts 3.0 KB
import { NativeUI } from '@/public/ts/NativeUI';
/**
 * AES对称加密工具类
 * @author zhangmk
 * @date 2021-11-16 14:13:58
 */
export default {
  /**·
   * 数据加密,只在移动设备上生效
   * @param {Object} jsonstr 发送给服务器的数据
   * @return {Object} jsonstr 返回加密后的json数据
   */
  encryptData(jsonstr: any) {
    let encryData = {};
    try {
      // SM2 加密秘钥
      // SM3 不可逆加密
      // SM4 加密密文
      let sm2 = require('sm-crypto').sm2,
        sm3 = require('sm-crypto').sm3,
        sm4 = require('sm-crypto').sm4,
        publicKey =
          '0494FEF4897CF4E9C9CB994B66B29E9B3EAF2C5C59EBEDB703B0F980199CEA7BDBF177AB3E65A17F3E96227977C55423929975CE535B715AC21E0AB23B9858AB4F', //SM2公钥
        sm4Key = this.randomStr(32);
      let encrySM2 = sm2.doEncrypt(sm4Key, publicKey, 1);
      encrySM2 = '04' + encrySM2; //上送给服务器时需要加’04‘头,如果是服务器解密需要把返回的04头去掉
      let encrySM4 = sm4.encrypt(jsonstr, sm4Key);
      let encrySM3 = sm3(jsonstr);
      encryData = {
        sm4Key: encrySM2,
        sm3: encrySM3,
        sm4: encrySM4
      };
    } catch (e) {
      console.log(e);
      NativeUI.toast('数据加密失败');
    }
    return encryData;
  },
  /**
   * 数据解密,只在移动设备上生效
   * @param {String} jsonstr 服务器返回json数据
   * @return {Object} jsonstr 返回解密后的json数据
   * {
   *  data: {
   *    sm4key:
   *    sm4:
   *    sm3:
   *  }
   *  msg:
   *  code: 1
   * }
   */
  decodeData(jsonData: any) {
    if (typeof jsonData != 'object') {
      jsonData = JSON.parse(jsonData);
    }
    try {
      let sm2 = require('sm-crypto').sm2,
        sm3 = require('sm-crypto').sm3,
        sm4 = require('sm-crypto').sm4,
        privateKey = '7666A8CA12A27CF6C440A1CFECB4B1BB7055F2FB3435E957EB35142FAB881EFB', //SM2公钥
        sm4Key = '',
        orSm4Key = jsonData.sm4key;
      orSm4Key = orSm4Key.substr(2, orSm4Key.length - 2);
      sm4Key = sm2.doDecrypt(orSm4Key, privateKey, 1);
      let dencrySM4 = sm4.decrypt(jsonData.sm4, sm4Key);
      if (dencrySM4.indexOf('€') != -1) {
        let dencrySM4Arr = dencrySM4.split('€');
        dencrySM4 = dencrySM4Arr[0];
      }
      // dencrySM4 = Public.hexToString(dencrySM4);
      dencrySM4.trim();
      let sm3Entry = sm3(dencrySM4);
      if (sm3Entry == jsonData.sm3) {
        jsonData = dencrySM4;
      }
    } catch (e) {
      NativeUI.toast('数据解密失败');
    }
    if (typeof jsonData == 'object') {
      return JSON.parse(jsonData);
    } else {
      return jsonData;
    }
  },
  /**
   * 生成随机数
   * zhangmk
   * 2021年11月16日19:31:14*/
  randomStr(length: any) {
    let strArr = '0123456789qwertyuiopasdfghjklzxcvbnm',
      result = '',
      max = 33,
      min = 0;
    for (let item = 0; item < length; item++) {
      let solt = Math.floor(Math.random() * (max - min) + min);
      result = result + strArr[solt];
    }
    return result;
  }
};