依赖

需要crypto依赖,可npm安装或去官方github上下载,和.js文件放在同一目录即可:
image.png

文件整体加密

  1. // 使用 require 方法加载 fs 核心模块
  2. const fs = require('fs')
  3. const CryptoJS = require('./crypto-js'); //引用AES源码js
  4. // 同步读取文件
  5. let contentText = fs.readFileSync('xxx.obj','utf-8');
  6. // console.log(contentText);
  7. // AES加密
  8. function Encrypt(word) {
  9. const key = CryptoJS.enc.Utf8.parse("1234567812345678"); //十六位十六进制数作为密钥
  10. console.log('key:::',key)
  11. const iv = CryptoJS.enc.Utf8.parse('8765432187654321'); //十六位十六进制数作为密钥偏移量
  12. let srcs = CryptoJS.enc.Utf8.parse(word);
  13. let encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
  14. return encrypted.ciphertext.toString().toUpperCase();
  15. }
  16. // AES解密
  17. function Decrypt(word) {
  18. const key = CryptoJS.enc.Utf8.parse("1234567812345678"); //十六位十六进制数作为密钥
  19. const iv = CryptoJS.enc.Utf8.parse('8765432187654321'); //十六位十六进制数作为密钥偏移量
  20. let encryptedHexStr = CryptoJS.enc.Hex.parse(word);
  21. let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
  22. let decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
  23. let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
  24. return decryptedStr.toString();
  25. }
  26. let outStr = Encrypt(contentText);
  27. // 同步写文件
  28. fs.writeFileSync('out.txt',Encrypt(contentText));
  29. fs.writeFileSync('out.obj',Decrypt(outStr));

文件按行读取加密

  1. // 使用 require 方法加载 fs 核心模块
  2. let fs = require('fs')
  3. let os = require('os')
  4. let path = require("path");
  5. let readline = require("readline");
  6. const CryptoJS = require('./crypto-js'); //引用AES源码js
  7. const readliner = readline.createInterface({
  8. input: fs.createReadStream(path.join(__dirname, './base.obj')),
  9. });
  10. // AES加密
  11. function Encrypt(word) {
  12. const key = CryptoJS.enc.Utf8.parse("1234567812345678"); //十六位十六进制数作为密钥
  13. const iv = CryptoJS.enc.Utf8.parse('8765432187654321'); //十六位十六进制数作为密钥偏移量
  14. let srcs = CryptoJS.enc.Utf8.parse(word);
  15. let encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
  16. return encrypted.ciphertext.toString().toUpperCase();
  17. }
  18. // AES解密
  19. function Decrypt(word) {
  20. const key = CryptoJS.enc.Utf8.parse("1234567812345678"); //十六位十六进制数作为密钥
  21. const iv = CryptoJS.enc.Utf8.parse('8765432187654321'); //十六位十六进制数作为密钥偏移量
  22. let encryptedHexStr = CryptoJS.enc.Hex.parse(word);
  23. let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
  24. let decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
  25. let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
  26. return decryptedStr.toString();
  27. }
  28. // 每行数据单独加密
  29. readliner.on('line', function(chunk) {
  30. //处理每一行数据
  31. console.log(chunk)
  32. fs.appendFileSync('out.txt',Encrypt(chunk)+os.EOL);
  33. });
  34. readliner.on('close', function() {
  35. //文件读取结束
  36. console.log('read finished')
  37. fs.appendFileSync('out.txt',Encrypt(strBuffer));
  38. });

文件分段加密

  1. // 使用 require 方法加载 fs 核心模块
  2. let fs = require('fs')
  3. let os = require('os')
  4. let path = require("path");
  5. let readline = require("readline");
  6. const CryptoJS = require('./crypto-js'); //引用AES源码js
  7. const readliner = readline.createInterface({
  8. input: fs.createReadStream(path.join(__dirname, './base.obj')),
  9. });
  10. // AES加密
  11. function Encrypt(word) {
  12. const key = CryptoJS.enc.Utf8.parse("1234567812345678"); //十六位十六进制数作为密钥
  13. const iv = CryptoJS.enc.Utf8.parse('8765432187654321'); //十六位十六进制数作为密钥偏移量
  14. let srcs = CryptoJS.enc.Utf8.parse(word);
  15. let encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
  16. return encrypted.ciphertext.toString().toUpperCase();
  17. }
  18. // AES解密
  19. function Decrypt(word) {
  20. const key = CryptoJS.enc.Utf8.parse("1234567812345678"); //十六位十六进制数作为密钥
  21. const iv = CryptoJS.enc.Utf8.parse('8765432187654321'); //十六位十六进制数作为密钥偏移量
  22. let encryptedHexStr = CryptoJS.enc.Hex.parse(word);
  23. let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
  24. let decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
  25. let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
  26. return decryptedStr.toString();
  27. }
  28. // 分段加密
  29. let count = 0 // 读取行数计数
  30. let strBuffer = '' // 读取数据暂存
  31. readliner.on('line', function(chunk) {
  32. //处理每一行数据
  33. strBuffer+=chunk // 获取当前行数据
  34. strBuffer+=os.EOL // 每读取一行,添加对应系统下的换行符
  35. count+=1 // 读取行数计数自增
  36. if (count === 100000){ // count:每读取100000行数据加密一次
  37. fs.appendFileSync('out.txt',Encrypt(strBuffer)); // 加密数据追加写入到out.txt中
  38. fs.appendFileSync('out.txt','nextBlock'); // 以‘nextBlock’作为分割符,分段解密时以此为依据进行分割
  39. count = 0 // 读取行数计数清零
  40. strBuffer = '' // 清空读取数据暂存内容
  41. }
  42. });
  43. readliner.on('close', function() {
  44. //文件读取结束
  45. console.log('read finished')
  46. fs.appendFileSync('out.txt',Encrypt(strBuffer)); // 将最后不满足总数为100000行的数据追加到文件中
  47. });

页面解密

  1. // 微信小程序
  2. // 需引入下文中的secret.js
  3. // 获取加密文件
  4. // 分段解密
  5. wx.request({
  6. url: url,
  7. data: '',
  8. header: {
  9. "Content-Type": "application/text",
  10. // 'Cache-Control': 'no-cache',
  11. 'Connection': 'keep-alive',
  12. // 'Pragma': 'no-cache'
  13. },
  14. success: function (res) {
  15. let lines = res.data.split("nextBlock"); // 分段解密分隔符
  16. let str = ''
  17. for (let i = 0; i < lines.length; i++) {
  18. str += Decrypt(lines[i])
  19. }
  20. console.log('final result data:',str) // 对解密后对数据进行操作处理
  21. },
  22. fail: function (err) {
  23. console.log(err)
  24. }
  25. })
  26. // AES加解密:secret.js
  27. // 需引入CryptoJS
  28. const CryptoJS = require('crypto-js'); //引用AES源码js
  29. const Crypto = require('crypto-js'); //引用AES源码js
  30. const key = CryptoJS.enc.Utf8.parse("1234567812345678"); //十六位十六进制数作为密钥
  31. const iv = CryptoJS.enc.Utf8.parse('8765432187654321'); //十六位十六进制数作为密钥偏移量
  32. //解密方法
  33. export function DecryptAll(word) {
  34. let encryptedHexStr = CryptoJS.enc.Hex.parse(word);
  35. let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
  36. let decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
  37. let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
  38. return decryptedStr.toString();
  39. }
  40. //解密方法
  41. export function Decrypt(word) {
  42. let encryptedHexStr = CryptoJS.enc.Hex.parse(word);
  43. let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
  44. let decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
  45. let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
  46. return decryptedStr.toString();
  47. }
  48. //加密方法
  49. export function Encrypt(word) {
  50. let srcs = CryptoJS.enc.Utf8.parse(word);
  51. let encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
  52. return encrypted.ciphertext.toString().toUpperCase();
  53. }