feat: add encrypt function

This commit is contained in:
rnet 2023-12-31 02:33:21 +08:00
parent 0b38130533
commit 5abb5e456a
7 changed files with 149 additions and 27 deletions

View File

@ -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;
}

View File

@ -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'),
}

View File

@ -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('');
}

View File

@ -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);
}

View File

@ -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', () => {

View File

@ -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');

View File

@ -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', () => {