ybp.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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 = '|====|';
  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. if (str.indexOf(rationSpr) >= 0) {
  32. const arr = str.split(rationSpr);
  33. const subject = JSON.parse(LzString.decompressFromBase64(arr[0]));
  34. for (let i = 1; i < arr.length; i++) {
  35. const ration = JSON.parse(LzString.decompressFromBase64(arr[i]));
  36. subject.rations.push(...ration);
  37. }
  38. return subject;
  39. } else {
  40. return JSON.parse(LzString.decompressFromBase64(str));
  41. }
  42. }
  43. decryptBuffer(buffer) {
  44. const arr = buffer.split(ybpSpr);
  45. const result = { header: '', subjects: [] };
  46. arr.forEach((s, i) => {
  47. if (i === 0) {
  48. result.header = JSON.parse(Decrypt(s));
  49. } else {
  50. switch (result.header.version) {
  51. case '3.0':
  52. result.subjects.push(this.parseSubject(s));
  53. break;
  54. default:
  55. result.subjects.push(JSON.parse(Decrypt(s)));
  56. break;
  57. }
  58. }
  59. });
  60. return result;
  61. }
  62. async decrypt(file) {
  63. const str = await fs.readFileSync(file, 'utf-8');
  64. return this.decryptBuffer(str);
  65. }
  66. }
  67. module.exports = ybp;