From 5abb5e456a4f5690cd8922b2a722daa650f04d9a Mon Sep 17 00:00:00 2001 From: rnet Date: Sun, 31 Dec 2023 02:33:21 +0800 Subject: [PATCH] feat: add encrypt function --- src/handler/parser/common/encrypt.js | 87 ++++++++++++++++++++++++++++ src/handler/parser/common/index.js | 42 +++++++------- src/handler/parser/common/swap.js | 13 ++++- src/handler/parser/common/tools.js | 16 +++++ test/cp0_96.test.js | 7 ++- test/parser.test.js | 7 ++- test/r2mka.test.js | 4 ++ 7 files changed, 149 insertions(+), 27 deletions(-) create mode 100644 src/handler/parser/common/encrypt.js create mode 100644 src/handler/parser/common/tools.js diff --git a/src/handler/parser/common/encrypt.js b/src/handler/parser/common/encrypt.js new file mode 100644 index 0000000..6a2bf7a --- /dev/null +++ b/src/handler/parser/common/encrypt.js @@ -0,0 +1,87 @@ +const gv = require('@src/handler/globalVarible'); + +function getTree() { + let arr = []; + for (let i = 1; i < gv.cp2[34]; i++) { + arr.push({ + total: 1, + idx: i + }); + } + arr.push({ + total: gv.cp2[55], + idx: gv.cp2[34] + }, { + total: gv.cp2[49], + idx: 0 + } + ); + function parse(item) { + for (let i = 0; i < arr.length; i++) { + if (item.total <= arr[i].total) { + arr.splice(i, 0, item); + return; + } + } + arr.push(item); + } + while (arr.length > 1) { + const [one, two] = arr.slice(0, gv.cp2[56]); + arr = arr.slice(gv.cp2[56]); + parse({ + total: one.total + two.total, + first: one, + second: two + }); + } + return arr[0]; +} + +function getKey(arr) { + for (let idx in arr) { + if (arr[idx].val >= gv.cp2[52]) { + return arr[idx].key >> arr[idx].val - gv.cp2[52]; + } + } +} + +function getEncryptConfig(tree, config = {key: 0, val: 0}, arr = []) { + // 返回用于加密的配置数组 + if (tree.idx === undefined) { + getEncryptConfig(tree.first, { + key: config.key << 1, + val: config.val + 1 + }, arr); + getEncryptConfig(tree.second, { + key: (config.key << 1) + 1, + val: config.val + 1 + }, arr) + } else { + arr[tree.idx] = config; + } + return [arr, getKey(arr)]; +} + +let encryptConfig = undefined; + +module.exports = function (numarr) { + // 对数字数组加密并返回加密后数组 + if (!encryptConfig) encryptConfig = getEncryptConfig(getTree()); + const ans = []; + const len = numarr.length; + let one = 0, two = 0; + for (let i = 0; i < len; i++) { + const cfg = encryptConfig[0][numarr[i]]; + one = one << cfg.val | cfg.key; + two += cfg.val; + while (two >= gv.cp2[52]) { + ans.push(one >> two - gv.cp2[52]); + one &= ~(gv.cp2[34] << two - gv.cp2[52]); + two -= gv.cp2[52]; + } + } + if (two > 0) { + ans.push(one << gv.cp2[52] - two | encryptConfig[1] >> two); + } + return ans; +} diff --git a/src/handler/parser/common/index.js b/src/handler/parser/common/index.js index 37c8ee8..2b743e2 100644 --- a/src/handler/parser/common/index.js +++ b/src/handler/parser/common/index.js @@ -1,21 +1,23 @@ -const { execRandomByNumber, execNumberByTime } = require('./random'); -exports.execNumberByTime = execNumberByTime; -exports.execRandomByNumber = execRandomByNumber; -exports.main = require('./main'); -exports.swap = require('./swap'); -exports.hexnum = require('./hexnum'); -exports.combine4 = require('./combine4'); -exports.bitwiseTwoNumarr = require('./bitwiseTwoNumarr'); -exports.decrypt = require('./decrypt'); -exports.extrace = require('./extrace'); -exports.decode = require('./decode'); -exports.uuid = require('./uuid'); -exports.numToNumarr2 = require('./numToNumarr2'); -exports.numToNumarr4 = require('./numToNumarr4'); -exports.numToNumarr8 = require('./numToNumarr8'); -exports.string2ascii = require('./string2ascii'); -exports.ascii2string = require('./ascii2string'); -exports.getFixedNumber = require('./getFixedNumber'); -exports.numarrAddTime = require('./numarrAddTime'); -exports.stringEncrypt = require('./stringEncrypt'); +module.exports = { + ...require('./random'), + ...require('./tools'), + ...require('./swap'), + main: require('./main'), + hexnum: require('./hexnum'), + combine4: require('./combine4'), + bitwiseTwoNumarr: require('./bitwiseTwoNumarr'), + decrypt: require('./decrypt'), + extrace: require('./extrace'), + decode: require('./decode'), + uuid: require('./uuid'), + numToNumarr2: require('./numToNumarr2'), + numToNumarr4: require('./numToNumarr4'), + numToNumarr8: require('./numToNumarr8'), + string2ascii: require('./string2ascii'), + ascii2string: require('./ascii2string'), + getFixedNumber: require('./getFixedNumber'), + numarrAddTime: require('./numarrAddTime'), + stringEncrypt: require('./stringEncrypt'), + encrypt: require('./encrypt'), +} diff --git a/src/handler/parser/common/swap.js b/src/handler/parser/common/swap.js index 143060a..526a57e 100644 --- a/src/handler/parser/common/swap.js +++ b/src/handler/parser/common/swap.js @@ -1,5 +1,5 @@ -// 字符交换方式解码字符串 -module.exports = function (str) { +// 字符每4位交换解码字符串 +exports.swap4 = function (str) { const arr = str.split(''); for (let idx = str.length - 4; idx >= 0; idx -= 4) { [arr[idx], arr[idx + 1], arr[idx + 3], arr[idx + 2]] = @@ -8,3 +8,12 @@ module.exports = function (str) { return arr.join(''); } +// 字符每2位交换解码字符串 +exports.swap2 = function (str) { + const arr = str.split(''); + for (let idx = str.length - 2; idx >= 0; idx -= 2) { + [arr[idx], arr[idx + 1]] = [arr[idx + 1], arr[idx]] + } + return arr.join(''); +} + diff --git a/src/handler/parser/common/tools.js b/src/handler/parser/common/tools.js new file mode 100644 index 0000000..2910073 --- /dev/null +++ b/src/handler/parser/common/tools.js @@ -0,0 +1,16 @@ +const gv = require('@src/handler/globalVarible'); + +exports.factorial = function (n) { + // 阶乘 + let ans = 1; + for (let i = 1; i <= n; i++) { + ans *= i; + } + return ans; +} + +exports.fibonacci = function (n) { + // 斐波那契 + if (n <= 1) return n; + return exports.fibonacci(n - 1) + exports.fibonacci(n - 2); +} diff --git a/test/cp0_96.test.js b/test/cp0_96.test.js index ae63c4e..854d38c 100644 --- a/test/cp0_96.test.js +++ b/test/cp0_96.test.js @@ -1,6 +1,6 @@ const paths = require('@utils/paths'); const fs = require('fs'); -const { main, swap, hexnum, init } = require('../src/handler/parser/'); +const { main, swap4, swap2, hexnum, init } = require('../src/handler/parser/'); const tsFullPath = paths.exampleResolve('codes', '1-$_ts-full.json'); init(JSON.parse(fs.readFileSync(tsFullPath, 'utf8'))); const gv = require('@src/handler/globalVarible'); @@ -23,11 +23,12 @@ const gv = require('@src/handler/globalVarible'); const valueMap = { 'visibilityState': main(gv.cp0_96(6, 69)).join(), - 'parseFloat': swap(gv.cp0_96(5, 18)) + hexnum(gv.cp0_96(8, 30)), + 'parseFloat': swap4(gv.cp0_96(5, 18)) + hexnum(gv.cp0_96(8, 30)), '11.678': hexnum(gv.cp0_96(7, 17)), - '1.234': swap(gv.cp0_96(8, 36)), + '1.234': swap4(gv.cp0_96(8, 36)), 'captureStackTrace': main(gv.cp0_96(7, 63))[0], '16777216': hexnum(gv.cp0_96(6, 76)), + 'avigator': swap2(gv.cp0_96(10, 63)), } test('test cp0_96', () => { diff --git a/test/parser.test.js b/test/parser.test.js index 86fec8f..4b45f78 100644 --- a/test/parser.test.js +++ b/test/parser.test.js @@ -3,7 +3,8 @@ const fs = require('fs'); const { init, main, - swap, + swap4, + swap2, hexnum, combine4, decrypt, @@ -17,6 +18,7 @@ const { getFixedNumber, numarrAddTime, stringEncrypt, + encrypt, } = require('../src/handler/parser/'); const tsFullPath = paths.exampleResolve('codes', '1-$_ts-full.json'); init(JSON.parse(fs.readFileSync(tsFullPath, 'utf8'))); @@ -27,7 +29,8 @@ describe('test parser common', () => { expect(main('inakaxadalqKlwl{')[0]).toBe('visibilityState'); }); test('test swap', () => { - expect(swap('rpsa')).toBe('pars'); + expect(swap4('rpsa')).toBe('pars'); + expect(swap2('nvagitaro')).toBe('navigator'); }); test('test hexnum', () => { expect(hexnum('65466c6f6174')).toBe('eFloat'); diff --git a/test/r2mka.test.js b/test/r2mka.test.js index 1c59d8a..37c8f3a 100644 --- a/test/r2mka.test.js +++ b/test/r2mka.test.js @@ -14,6 +14,10 @@ const valueMap = { '4': ascii2string(gv.keys[gv.cp2[4]]), '47': ascii2string(gv.keys[gv.cp2[35]]), '52': ascii2string(gv.keys[gv.cp2[81]]), + '_$dV': ascii2string(gv.keys[gv.cp2[146]]), + '_$_i': ascii2string(gv.keys[gv.cp2[70]]), + '_$hv': ascii2string(gv.keys[gv.cp2[1]]), + '_$go': ascii2string(gv.keys[gv.cp2[48]]), } test('test r2mka', () => {