crypt.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. 'use strict';
  2. /**
  3. *
  4. *
  5. * @author Mai
  6. * @date
  7. * @version
  8. */
  9. const crypto = require('crypto-js');
  10. const fs = require('fs');
  11. const path = require('path');
  12. const encryptSpr = '|----|';
  13. const baseKey = crypto.enc.Utf8.parse('Sc3850?Calc888Zh'); // 十六位十六进制数作为密钥
  14. const baseIv = crypto.enc.Utf8.parse('Zh888!Sc3850Calc'); // 十六位十六进制数作为密钥偏移量
  15. const baseUtils = {
  16. aesDecrypt: function(str, key, iv) {
  17. const encryptedHexStr = crypto.enc.Hex.parse(str);
  18. const src = crypto.enc.Base64.stringify(encryptedHexStr);
  19. const decrypt = crypto.AES.decrypt(src, key, {
  20. iv,
  21. mode: crypto.mode.CBC,
  22. padding: crypto.pad.Pkcs7,
  23. });
  24. const decryptedStr = decrypt.toString(crypto.enc.Utf8);
  25. return decryptedStr.toString();
  26. },
  27. aesEncrypt: function(str, key, iv) {
  28. const src = crypto.enc.Utf8.parse(str);
  29. const encrypted = crypto.AES.encrypt(src, key, {
  30. iv,
  31. mode: crypto.mode.CBC,
  32. padding: crypto.pad.Pkcs7,
  33. });
  34. return encrypted.ciphertext.toString().toUpperCase();
  35. },
  36. md5: function(str) {
  37. return crypto.MD5(str).toString();
  38. },
  39. decryptBuffer: function(buffer) {
  40. try {
  41. const result = [];
  42. const arr = buffer.split(encryptSpr);
  43. const header = JSON.parse(this.aesDecrypt(arr[0], baseKey, baseIv));
  44. header.key = crypto.enc.Hex.parse(header.key);
  45. header.iv = crypto.enc.Hex.parse(header.iv);
  46. arr.shift();
  47. const check = this.md5(arr.join(encryptSpr));
  48. if (check !== header.check) throw '文件被篡改';
  49. for (const a of arr) {
  50. result.push(JSON.parse(this.aesDecrypt(a, header.key, header.iv)));
  51. }
  52. return header.data === 'array' ? result : result[0];
  53. } catch(err) {
  54. throw err;
  55. }
  56. },
  57. getRamdonHeader: function () {
  58. return {
  59. key: crypto.lib.WordArray.random(16),
  60. iv: crypto.lib.WordArray.random(16),
  61. };
  62. },
  63. encryptBuffer: function(data) {
  64. const datas = data instanceof Array ? data : [data];
  65. const header = this.getRamdonHeader();
  66. const arr = [];
  67. for (const d of datas) {
  68. arr.push(this.aesEncrypt(JSON.stringify(d), header.key, header.iv ));
  69. }
  70. header.key = header.key.toString();
  71. header.iv = header.iv.toString();
  72. header.check = this.md5(arr.join(encryptSpr));
  73. header.data = data instanceof Array ? 'array' : 'object';
  74. return this.aesEncrypt(JSON.stringify(header), baseKey, baseIv) + encryptSpr + arr.join(encryptSpr);
  75. },
  76. };
  77. class baseFile {
  78. doDecrypt(str) {
  79. }
  80. async decrypt(file) {
  81. const str = await fs.readFileSync(file, 'utf-8');
  82. return this.doDecrypt(str);
  83. }
  84. async recursiveMkdirSync(pathName) {
  85. if (!fs.existsSync(pathName)) {
  86. const upperPath = path.dirname(pathName);
  87. if (!fs.existsSync(upperPath)) {
  88. await this.recursiveMkdirSync(upperPath);
  89. }
  90. await fs.mkdirSync(pathName);
  91. }
  92. }
  93. doEncrypt(data) {
  94. }
  95. async encrypt(data, file) {
  96. const buffer = this.doEncrypt(data);
  97. // 检查文件夹是否存在,不存在则直接创建文件夹
  98. const pathName = path.dirname(file);
  99. if (!fs.existsSync(pathName)) await this.recursiveMkdirSync(pathName);
  100. await fs.writeFileSync(file, buffer);
  101. }
  102. }
  103. class cpd extends baseFile {
  104. doEncrypt(data) {
  105. return baseUtils.encryptBuffer(data);
  106. }
  107. doDecrypt(str) {
  108. return baseUtils.decryptBuffer(str);
  109. }
  110. }
  111. module.exports = {
  112. cpd
  113. };