sm4.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623
  1. const Cookies = require('js-cookie');
  2. const CryptoJS = require('crypto-js');
  3. var Base64 = Base64 || require('./base64.js').Base64;
  4. /**
  5. * 国密SM4加密算法
  6. */
  7. function SM4_Context() {
  8. this.mode = 1;
  9. this.isPadding = true;
  10. this.sk = new Array(32);
  11. }
  12. function SM4() {
  13. this.SM4_ENCRYPT = 1;
  14. this.SM4_DECRYPT = 0;
  15. const SboxTable = [ 0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 0xb6, 0x14, 0xc2, 0x28, 0xfb, 0x2c, 0x05,
  16. 0x2b, 0x67, 0x9a, 0x76, 0x2a, 0xbe, 0x04, 0xc3, 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99,
  17. 0x9c, 0x42, 0x50, 0xf4, 0x91, 0xef, 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62,
  18. 0xe4, 0xb3, 0x1c, 0xa9, 0xc9, 0x08, 0xe8, 0x95, 0x80, 0xdf, 0x94, 0xfa, 0x75, 0x8f, 0x3f, 0xa6,
  19. 0x47, 0x07, 0xa7, 0xfc, 0xf3, 0x73, 0x17, 0xba, 0x83, 0x59, 0x3c, 0x19, 0xe6, 0x85, 0x4f, 0xa8,
  20. 0x68, 0x6b, 0x81, 0xb2, 0x71, 0x64, 0xda, 0x8b, 0xf8, 0xeb, 0x0f, 0x4b, 0x70, 0x56, 0x9d, 0x35,
  21. 0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, 0xd1, 0xa2, 0x25, 0x22, 0x7c, 0x3b, 0x01, 0x21, 0x78, 0x87,
  22. 0xd4, 0x00, 0x46, 0x57, 0x9f, 0xd3, 0x27, 0x52, 0x4c, 0x36, 0x02, 0xe7, 0xa0, 0xc4, 0xc8, 0x9e,
  23. 0xea, 0xbf, 0x8a, 0xd2, 0x40, 0xc7, 0x38, 0xb5, 0xa3, 0xf7, 0xf2, 0xce, 0xf9, 0x61, 0x15, 0xa1,
  24. 0xe0, 0xae, 0x5d, 0xa4, 0x9b, 0x34, 0x1a, 0x55, 0xad, 0x93, 0x32, 0x30, 0xf5, 0x8c, 0xb1, 0xe3,
  25. 0x1d, 0xf6, 0xe2, 0x2e, 0x82, 0x66, 0xca, 0x60, 0xc0, 0x29, 0x23, 0xab, 0x0d, 0x53, 0x4e, 0x6f,
  26. 0xd5, 0xdb, 0x37, 0x45, 0xde, 0xfd, 0x8e, 0x2f, 0x03, 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b, 0x51,
  27. 0x8d, 0x1b, 0xaf, 0x92, 0xbb, 0xdd, 0xbc, 0x7f, 0x11, 0xd9, 0x5c, 0x41, 0x1f, 0x10, 0x5a, 0xd8,
  28. 0x0a, 0xc1, 0x31, 0x88, 0xa5, 0xcd, 0x7b, 0xbd, 0x2d, 0x74, 0xd0, 0x12, 0xb8, 0xe5, 0xb4, 0xb0,
  29. 0x89, 0x69, 0x97, 0x4a, 0x0c, 0x96, 0x77, 0x7e, 0x65, 0xb9, 0xf1, 0x09, 0xc5, 0x6e, 0xc6, 0x84,
  30. 0x18, 0xf0, 0x7d, 0xec, 0x3a, 0xdc, 0x4d, 0x20, 0x79, 0xee, 0x5f, 0x3e, 0xd7, 0xcb, 0x39, 0x48,
  31. ];
  32. const FK = [ 0xa3b1bac6, 0x56aa3350, 0x677d9197, 0xb27022dc ];
  33. const CK = [ 0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,
  34. 0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,
  35. 0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249,
  36. 0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9,
  37. 0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229,
  38. 0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299,
  39. 0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209,
  40. 0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279,
  41. ];
  42. this.GET_ULONG_BE = function(b, i) {
  43. return (b[i] & 0xff) << 24 | ((b[i + 1] & 0xff) << 16) | ((b[i + 2] & 0xff) << 8) | (b[i + 3] & 0xff) & 0xffffffff;
  44. };
  45. this.PUT_ULONG_BE = function(n, b, i) {
  46. const t1 = (0xFF & (n >> 24));
  47. const t2 = (0xFF & (n >> 16));
  48. const t3 = (0xFF & (n >> 8));
  49. const t4 = (0xFF & (n));
  50. b[i] = t1 > 128 ? t1 - 256 : t1;
  51. b[i + 1] = t2 > 128 ? t2 - 256 : t2;
  52. b[i + 2] = t3 > 128 ? t3 - 256 : t3;
  53. b[i + 3] = t4 > 128 ? t4 - 256 : t4;
  54. };
  55. this.SHL = function(x, n) {
  56. return (x & 0xFFFFFFFF) << n;
  57. };
  58. this.ROTL = function(x, n) {
  59. const s = this.SHL(x, n);
  60. const ss = x >> (32 - n);
  61. return this.SHL(x, n) | x >> (32 - n);
  62. };
  63. this.sm4Lt = function(ka) {
  64. let bb = 0;
  65. let c = 0;
  66. const a = new Array(4);
  67. const b = new Array(4);
  68. this.PUT_ULONG_BE(ka, a, 0);
  69. b[0] = this.sm4Sbox(a[0]);
  70. b[1] = this.sm4Sbox(a[1]);
  71. b[2] = this.sm4Sbox(a[2]);
  72. b[3] = this.sm4Sbox(a[3]);
  73. bb = this.GET_ULONG_BE(b, 0);
  74. c = bb ^ this.ROTL(bb, 2) ^ this.ROTL(bb, 10) ^ this.ROTL(bb, 18) ^ this.ROTL(bb, 24);
  75. return c;
  76. };
  77. this.sm4F = function(x0, x1, x2, x3, rk) {
  78. return x0 ^ this.sm4Lt(x1 ^ x2 ^ x3 ^ rk);
  79. };
  80. this.sm4CalciRK = function(ka) {
  81. let bb = 0;
  82. let rk = 0;
  83. const a = new Array(4);
  84. const b = new Array(4);
  85. this.PUT_ULONG_BE(ka, a, 0);
  86. b[0] = this.sm4Sbox(a[0]);
  87. b[1] = this.sm4Sbox(a[1]);
  88. b[2] = this.sm4Sbox(a[2]);
  89. b[3] = this.sm4Sbox(a[3]);
  90. bb = this.GET_ULONG_BE(b, 0);
  91. rk = bb ^ this.ROTL(bb, 13) ^ this.ROTL(bb, 23);
  92. return rk;
  93. };
  94. this.sm4Sbox = function(inch) {
  95. const i = inch & 0xFF;
  96. const retVal = SboxTable[i];
  97. return retVal > 128 ? retVal - 256 : retVal;
  98. };
  99. this.sm4_setkey_enc = function(ctx, key) {
  100. if (ctx == null) {
  101. alert('ctx is null!');
  102. return false;
  103. }
  104. if (key == null || key.length != 16) {
  105. alert('key error!');
  106. return false;
  107. }
  108. ctx.mode = this.SM4_ENCRYPT;
  109. this.sm4_setkey(ctx.sk, key);
  110. };
  111. // 生成解密密钥
  112. this.sm4_setkey_dec = function(ctx, key) {
  113. if (ctx == null) {
  114. Error('ctx is null!');
  115. }
  116. if (key == null || key.length != 16) {
  117. Error('key error!');
  118. }
  119. const i = 0;
  120. ctx.mode = 0;
  121. this.sm4_setkey(ctx.sk, key);
  122. ctx.sk = ctx.sk.reverse();
  123. };
  124. this.sm4_setkey = function(SK, key) {
  125. const MK = new Array(4);
  126. const k = new Array(36);
  127. var i = 0;
  128. MK[0] = this.GET_ULONG_BE(key, 0);
  129. MK[1] = this.GET_ULONG_BE(key, 4);
  130. MK[2] = this.GET_ULONG_BE(key, 8);
  131. MK[3] = this.GET_ULONG_BE(key, 12);
  132. k[0] = MK[0] ^ FK[0];
  133. k[1] = MK[1] ^ FK[1];
  134. k[2] = MK[2] ^ FK[2];
  135. k[3] = MK[3] ^ FK[3];
  136. for (var i = 0; i < 32; i++) {
  137. k[(i + 4)] = (k[i] ^ this.sm4CalciRK(k[(i + 1)] ^ k[(i + 2)] ^ k[(i + 3)] ^ CK[i]));
  138. SK[i] = k[(i + 4)];
  139. }
  140. };
  141. this.padding = function(input, mode) {
  142. if (input == null) {
  143. return null;
  144. }
  145. let ret = null;
  146. if (mode == this.SM4_ENCRYPT) {
  147. var p = parseInt(16 - input.length % 16);
  148. ret = input.slice(0);
  149. for (let i = 0; i < p; i++) {
  150. ret[input.length + i] = p;
  151. }
  152. } else {
  153. var p = input[input.length - 1];
  154. ret = input.slice(0, input.length - p);
  155. }
  156. return ret;
  157. };
  158. this.sm4_one_round = function(sk, input, output) {
  159. let i = 0;
  160. const ulbuf = new Array(36);
  161. ulbuf[0] = this.GET_ULONG_BE(input, 0);
  162. ulbuf[1] = this.GET_ULONG_BE(input, 4);
  163. ulbuf[2] = this.GET_ULONG_BE(input, 8);
  164. ulbuf[3] = this.GET_ULONG_BE(input, 12);
  165. while (i < 32) {
  166. ulbuf[(i + 4)] = this.sm4F(ulbuf[i], ulbuf[(i + 1)], ulbuf[(i + 2)], ulbuf[(i + 3)], sk[i]);
  167. i++;
  168. }
  169. this.PUT_ULONG_BE(ulbuf[35], output, 0);
  170. this.PUT_ULONG_BE(ulbuf[34], output, 4);
  171. this.PUT_ULONG_BE(ulbuf[33], output, 8);
  172. this.PUT_ULONG_BE(ulbuf[32], output, 12);
  173. };
  174. this.sm4_crypt_ecb = function(ctx, input) {
  175. if (input == null) {
  176. alert('input is null!');
  177. }
  178. if ((ctx.isPadding) && (ctx.mode == this.SM4_ENCRYPT)) {
  179. input = this.padding(input, this.SM4_ENCRYPT);
  180. }
  181. var i = 0;
  182. let length = input.length;
  183. let bous = new Array();
  184. for (; length > 0; length -= 16) {
  185. const out = new Array(16);
  186. const ins = input.slice(i * 16, (16 * (i + 1)));
  187. this.sm4_one_round(ctx.sk, ins, out);
  188. bous = bous.concat(out);
  189. i++;
  190. }
  191. let output = bous;
  192. if (ctx.isPadding && ctx.mode == this.SM4_DECRYPT) {
  193. output = this.padding(output, this.SM4_DECRYPT);
  194. }
  195. for (var i = 0; i < output.length; i++) {
  196. if (output[i] < 0) {
  197. output[i] = output[i] + 256;
  198. }
  199. }
  200. return output;
  201. };
  202. this.sm4_crypt_cbc = function(ctx, iv, input) {
  203. if (iv == null || iv.length != 16) {
  204. alert('iv error!');
  205. }
  206. if (input == null) {
  207. alert('input is null!');
  208. }
  209. if (ctx.isPadding && ctx.mode == this.SM4_ENCRYPT) {
  210. input = this.padding(input, this.SM4_ENCRYPT);
  211. }
  212. var i = 0;
  213. let length = input.length;
  214. let bous = new Array();
  215. if (ctx.mode == this.SM4_ENCRYPT) {
  216. var k = 0;
  217. for (; length > 0; length -= 16) {
  218. var out = new Array(16);
  219. var out1 = new Array(16);
  220. var ins = input.slice(k * 16, (16 * (k + 1)));
  221. for (i = 0; i < 16; i++) {
  222. out[i] = (ins[i] ^ iv[i]);
  223. }
  224. this.sm4_one_round(ctx.sk, out, out1);
  225. iv = out1.slice(0, 16);
  226. bous = bous.concat(out1);
  227. k++;
  228. }
  229. } else {
  230. let temp = [];
  231. var k = 0;
  232. for (; length > 0; length -= 16) {
  233. var out = new Array(16);
  234. var out1 = new Array(16);
  235. var ins = input.slice(k * 16, (16 * (k + 1)));
  236. temp = ins.slice(0, 16);
  237. this.sm4_one_round(ctx.sk, ins, out);
  238. for (i = 0; i < 16; i++) {
  239. out1[i] = (out[i] ^ iv[i]);
  240. }
  241. iv = temp.slice(0, 16);
  242. bous = bous.concat(out1);
  243. k++;
  244. }
  245. }
  246. let output = bous;
  247. if (ctx.isPadding && ctx.mode == this.SM4_DECRYPT) {
  248. output = this.padding(output, this.SM4_DECRYPT);
  249. }
  250. for (var i = 0; i < output.length; i++) {
  251. if (output[i] < 0) {
  252. output[i] = output[i] + 256;
  253. }
  254. }
  255. return output;
  256. };
  257. }
  258. function SM4Util() {
  259. this.secretKey = '';
  260. this.iv = '';
  261. this.hexString = false;
  262. // 加密_ECB
  263. this.encryptData_ECB = function(plainText) {
  264. try {
  265. const sm4 = new SM4();
  266. const ctx = new SM4_Context();
  267. ctx.isPadding = true;
  268. ctx.mode = sm4.SM4_ENCRYPT;
  269. const keyBytes = stringToByte(this.secretKey);
  270. sm4.sm4_setkey_enc(ctx, keyBytes);
  271. const encrypted = sm4.sm4_crypt_ecb(ctx, stringToByte(plainText));
  272. const cipherText = Base64.fromUint8Array(encrypted);
  273. if (cipherText != null && cipherText.trim().length > 0) {
  274. cipherText.replace(/(\s*|\t|\r|\n)/g, '');
  275. }
  276. return cipherText;
  277. } catch (e) {
  278. console.error(e);
  279. return null;
  280. }
  281. };
  282. // 解密_ECB
  283. this.decryptData_ECB = function (cipherText) {
  284. if (cipherText) {
  285. try {
  286. const sm4 = new SM4();
  287. const ctx = new SM4_Context();
  288. ctx.isPadding = true;
  289. ctx.mode = sm4.SM4_ENCRYPT;
  290. const keyBytes = stringToByte(this.secretKey);
  291. sm4.sm4_setkey_dec(ctx, keyBytes);
  292. if (typeof cipherText === 'string') {
  293. const decrypted = sm4.sm4_crypt_ecb(ctx, Base64.toUint8Array(cipherText));
  294. return byteToString(decrypted);
  295. } else if (cipherText instanceof Array) {
  296. const decrypted = [];
  297. cipherText.forEach(item => {
  298. const str = sm4.sm4_crypt_ecb(ctx, Base64.toUint8Array(item));
  299. decrypted.push(byteToString(str));
  300. });
  301. return decrypted;
  302. }
  303. } catch (e) {
  304. console.error(e);
  305. return null;
  306. }
  307. }
  308. };
  309. this.encryptData_CBC = function(plainText) {
  310. try {
  311. const sm4 = new SM4();
  312. const ctx = new SM4_Context();
  313. ctx.isPadding = true;
  314. ctx.mode = sm4.SM4_ENCRYPT;
  315. const keyBytes = stringToByte(this.secretKey);
  316. const ivBytes = stringToByte(this.iv);
  317. sm4.sm4_setkey_enc(ctx, keyBytes);
  318. const encrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, stringToByte(plainText));
  319. const cipherText = Base64.fromUint8Array(encrypted);
  320. if (cipherText != null && cipherText.trim().length > 0) {
  321. cipherText.replace(/(\s*|\t|\r|\n)/g, '');
  322. }
  323. return cipherText;
  324. } catch (e) {
  325. console.error(e);
  326. return null;
  327. }
  328. };
  329. // 解密_CBC
  330. this.decryptData_CBC = function(cipherText) {
  331. try {
  332. const sm4 = new SM4();
  333. const ctx = new SM4_Context();
  334. ctx.isPadding = true;
  335. ctx.mode = sm4.SM4_ENCRYPT;
  336. const keyBytes = stringToByte(this.secretKey);
  337. const ivBytes = stringToByte(this.iv);
  338. sm4.sm4_setkey_dec(ctx, keyBytes);
  339. const decrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, Base64.toUint8Array(cipherText));
  340. return byteToString(decrypted);
  341. } catch (e) {
  342. console.error(e);
  343. return null;
  344. }
  345. };
  346. function stringToByte(str) {
  347. const bytes = new Array();
  348. let len,
  349. c;
  350. len = str.length;
  351. for (let i = 0; i < len; i++) {
  352. c = str.charCodeAt(i);
  353. if (c >= 0x010000 && c <= 0x10FFFF) {
  354. bytes.push(((c >> 18) & 0x07) | 0xF0);
  355. bytes.push(((c >> 12) & 0x3F) | 0x80);
  356. bytes.push(((c >> 6) & 0x3F) | 0x80);
  357. bytes.push((c & 0x3F) | 0x80);
  358. } else if (c >= 0x000800 && c <= 0x00FFFF) {
  359. bytes.push(((c >> 12) & 0x0F) | 0xE0);
  360. bytes.push(((c >> 6) & 0x3F) | 0x80);
  361. bytes.push((c & 0x3F) | 0x80);
  362. } else if (c >= 0x000080 && c <= 0x0007FF) {
  363. bytes.push(((c >> 6) & 0x1F) | 0xC0);
  364. bytes.push((c & 0x3F) | 0x80);
  365. } else {
  366. bytes.push(c & 0xFF);
  367. }
  368. }
  369. return bytes;
  370. }
  371. function byteToString(arr) {
  372. if (typeof arr === 'string') {
  373. return arr;
  374. }
  375. let str = '',
  376. _arr = arr;
  377. for (let i = 0; i < _arr.length; i++) {
  378. const one = _arr[i].toString(2),
  379. v = one.match(/^1+?(?=0)/);
  380. if (v && one.length == 8) {
  381. const bytesLength = v[0].length;
  382. let store = _arr[i].toString(2).slice(7 - bytesLength);
  383. for (let st = 1; st < bytesLength; st++) {
  384. store += _arr[st + i].toString(2).slice(2);
  385. }
  386. str += String.fromCharCode(parseInt(store, 2));
  387. i += bytesLength - 1;
  388. } else {
  389. str += String.fromCharCode(_arr[i]);
  390. }
  391. }
  392. return str;
  393. }
  394. }
  395. function getsm4Key() {
  396. const token = '1234567887654321';
  397. // return CryptoJS.MD5(token).toString().toUpperCase().substr(16, 16)
  398. return token;
  399. }
  400. function getsm4Iv() {
  401. let token = Cookies.get('Admin-Token').toString();
  402. if (token == null || token.length == 0) token = '1234567887654321';
  403. return CryptoJS.MD5(CryptoJS.MD5(token).toString()).toString().toUpperCase()
  404. .substr(16, 16);
  405. }
  406. function maskA(str, cd) {
  407. const cdc = str.length - 2 * cd;
  408. if (cdc > 0) {
  409. let reptext = '';
  410. for (let k = 0; k < cdc; k++) {
  411. reptext = reptext + '✱';
  412. }
  413. return str.substr(0, cd) + reptext + str.substr(str.length - cd);
  414. }
  415. return str;
  416. }
  417. function mask(str, type) {
  418. const strcd = str != null ? str.length : 0;
  419. if (strcd > 0) {
  420. if (type == 1) // 姓名
  421. {
  422. if (strcd > 1) {
  423. const cdc = strcd - 1;
  424. let reptext = '';
  425. for (let k = 0; k < cdc; k++) {
  426. reptext = reptext + '✱';
  427. }
  428. return reptext + str.substr(cdc);
  429. }
  430. return str;
  431. } else if (type == 2)// 身份证号
  432. {
  433. if (strcd == 18) {
  434. return str.substr(0, 3) + '✱✱✱✱✱' + str.substr(8, 1) + '✱✱✱✱✱✱✱' + str.substr(16, 1) + '✱';
  435. }
  436. return maskA(str, 1);
  437. } else if (type == 3)// 手机号
  438. {
  439. if (strcd == 11) {
  440. return str.substr(0, 2) + '✱✱✱✱✱✱✱✱' + str.substr(10, 1);
  441. }
  442. return maskA(str, 2);
  443. } else if (type == 4)// 住址
  444. {
  445. return maskA(str, 2);
  446. } else if (type == 5)// 邮件地址
  447. {
  448. return maskA(str, 2);
  449. } else if (type == 6) {
  450. return maskA(str, 1);
  451. }
  452. return str;
  453. }
  454. return str;
  455. }
  456. function maskArr(arr, type) {
  457. const res = [];
  458. arr.forEach(str => {
  459. const strcd = str != null ? str.length : 0;
  460. if (strcd > 0) {
  461. if (type == 1) // 姓名
  462. {
  463. if (strcd > 1) {
  464. const cdc = strcd - 1;
  465. let reptext = '';
  466. for (let k = 0; k < cdc; k++) {
  467. reptext = reptext + '✱';
  468. }
  469. res.push(reptext + str.substr(cdc));
  470. } else {
  471. res.push(str);
  472. }
  473. } else if (type == 2)// 身份证号
  474. {
  475. if (strcd == 18) {
  476. res.push(str.substr(0, 3) + '✱✱✱✱✱' + str.substr(8, 1) + '✱✱✱✱✱✱✱' + str.substr(16, 1) + '✱');
  477. } else {
  478. res.push(maskA(str, 1));
  479. }
  480. } else if (type == 3)// 手机号
  481. {
  482. if (strcd == 11) {
  483. res.push(str.substr(0, 2) + '✱✱✱✱✱✱✱✱' + str.substr(10, 1));
  484. } else {
  485. res.push(maskA(str, 2));
  486. }
  487. } else if (type == 4)// 住址
  488. {
  489. res.push(maskA(str, 2));
  490. } else if (type == 5)// 邮件地址
  491. {
  492. res.push(maskA(str, 2));
  493. } else if (type == 6)// 邮件地址
  494. {
  495. res.push(maskA(str, 1));
  496. } else {
  497. res.push(str);
  498. }
  499. } else {
  500. res.push(str);
  501. }
  502. });
  503. return res;
  504. }
  505. var sm4 = sm4 || {};
  506. sm4.encrypt_ECB = function(data) {
  507. if (data === '') {
  508. return '';
  509. }
  510. if (data != null) {
  511. const s4 = new SM4Util();
  512. s4.secretKey = getsm4Key();
  513. return s4.encryptData_ECB(data);
  514. } return null;
  515. };
  516. sm4.encrypt_ECBA = function(data, key) {
  517. const s4 = new SM4Util();
  518. s4.secretKey = key;
  519. return s4.encryptData_ECB(data);
  520. };
  521. sm4.decrypt_ECB = function(data) {
  522. const s4 = new SM4Util();
  523. s4.secretKey = getsm4Key();
  524. return s4.decryptData_ECB(data);
  525. };
  526. sm4.masks = function(str, type) {
  527. return mask(str, type);
  528. };
  529. sm4.encrypt_CBC = function(data) {
  530. const s4 = new SM4Util();
  531. s4.secretKey = getsm4Key();
  532. s4.iv = getsm4Iv();
  533. return s4.encryptData_CBC(data);
  534. };
  535. sm4.decrypt_CBC = function(data) {
  536. const s4 = new SM4Util();
  537. s4.secretKey = getsm4Key();
  538. s4.iv = getsm4Iv();
  539. return s4.decryptData_CBC(data);
  540. };
  541. sm4.decryptData_ECB = function(rowdata, fields, hides) {
  542. if (rowdata) {
  543. const s4 = new SM4Util();
  544. s4.secretKey = getsm4Key();
  545. for (let j = 0; j < fields.length; j++) {
  546. if (rowdata[fields[j]] != null) {
  547. const zfc = s4.decryptData_ECB(rowdata[fields[j]]);
  548. zfc instanceof Array ? rowdata[fields[j]] = maskArr(zfc, hides[j]) : rowdata[fields[j]] = mask(zfc, hides[j]);
  549. }
  550. }
  551. }
  552. return rowdata;
  553. };
  554. sm4.decryptRowData_ECB = function(rowdata, fields, hides) {
  555. if (rowdata && rowdata.length > 0) {
  556. const s4 = new SM4Util();
  557. s4.secretKey = getsm4Key();
  558. for (let i = 0; i < rowdata.length; i++) {
  559. for (let j = 0; j < fields.length; j++) {
  560. if (rowdata[i][fields[j]] != null) {
  561. const srcs = rowdata[i][fields[j]];
  562. const zfc = s4.decryptData_ECB(srcs);
  563. rowdata[i][fields[j]] = mask(zfc, hides[j]);
  564. }
  565. }
  566. }
  567. }
  568. return rowdata;
  569. };
  570. exports.sma4 = sm4;