ybp.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. 'use strict';
  2. /**
  3. *
  4. *
  5. * @author Mai
  6. * @date
  7. * @version
  8. */
  9. const CryptoJS = require('crypto-js');
  10. const LzString = require('lz-string');
  11. const { decode } = require('js-base64');
  12. const _interopDefaultLegacy = function(e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; };
  13. const CryptoJS__default = /* #__PURE__*/_interopDefaultLegacy(CryptoJS);
  14. const key = CryptoJS__default.default.enc.Utf8.parse('7563850888ABCDEF'); // 十六位十六进制数作为密钥
  15. const iv = CryptoJS__default.default.enc.Utf8.parse('ABCDEF7563850888'); // 十六位十六进制数作为密钥偏移量
  16. const fs = require('fs');
  17. const ybpSpr = '|----|', rationSpr = '|====|', billsSpr = '|++++|', qtyCalcSpr = '|~~~~|';
  18. const Decrypt = function(str) {
  19. const encryptedHexStr = CryptoJS__default.default.enc.Hex.parse(str);
  20. const src = CryptoJS__default.default.enc.Base64.stringify(encryptedHexStr);
  21. const decrypt = CryptoJS__default.default.AES.decrypt(src, key, {
  22. iv,
  23. mode: CryptoJS__default.default.mode.CBC,
  24. padding: CryptoJS__default.default.pad.Pkcs7,
  25. });
  26. const decryptedStr = decrypt.toString(CryptoJS__default.default.enc.Utf8);
  27. return decryptedStr.toString();
  28. };
  29. class ybp {
  30. parseSubject(str) {
  31. let billsParts = [];
  32. if (str.indexOf(billsSpr) >= 0) {
  33. const parts = str.split(billsSpr);
  34. str = parts[0];
  35. billsParts = parts.slice(1);
  36. }
  37. let qtyCalcParts = [];
  38. if (str.indexOf(qtyCalcSpr) >= 0) {
  39. const parts = str.split(qtyCalcSpr);
  40. str = parts[0];
  41. qtyCalcParts = parts.slice(1);
  42. }
  43. let result;
  44. if (str.indexOf(rationSpr) >= 0) {
  45. const arr = str.split(rationSpr);
  46. const subject = JSON.parse(LzString.decompressFromBase64(arr[0]));
  47. for (let i = 1; i < arr.length; i++) {
  48. const ration = JSON.parse(LzString.decompressFromBase64(arr[i]));
  49. subject.rations.push(...ration);
  50. }
  51. result = subject;
  52. } else {
  53. result = JSON.parse(LzString.decompressFromBase64(str));
  54. }
  55. if (billsParts.length > 0) {
  56. if (!result.bills) result.bills = [];
  57. for (const part of billsParts) {
  58. const bills = JSON.parse(LzString.decompressFromBase64(part));
  59. result.bills.push(...bills);
  60. }
  61. }
  62. // todo 暂不考虑算量数据
  63. return result;
  64. }
  65. decryptBuffer(buffer) {
  66. const arr = buffer.split(ybpSpr);
  67. const result = { header: '', subjects: [] };
  68. arr.forEach((s, i) => {
  69. if (i === 0) {
  70. result.header = JSON.parse(Decrypt(s));
  71. } else {
  72. switch (result.header.version) {
  73. case '3.0':
  74. result.subjects.push(this.parseSubject(s));
  75. break;
  76. default:
  77. result.subjects.push(JSON.parse(Decrypt(s)));
  78. break;
  79. }
  80. }
  81. });
  82. return result;
  83. }
  84. async decrypt(file) {
  85. const str = await fs.readFileSync(file, 'utf-8');
  86. return this.decryptBuffer(str);
  87. }
  88. }
  89. module.exports = ybp;