1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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;
}
};