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