mirror of
https://github.com/pysunday/rs-reverse.git
synced 2025-04-12 03:46:56 +08:00
111 lines
3.9 KiB
JavaScript
111 lines
3.9 KiB
JavaScript
const gv = require('@src/handler/globalVarible');
|
|
const numarrAddTime = require('./numarrAddTime');
|
|
const combine4 = require('./combine4');
|
|
const numToNumarr4 = require('./numToNumarr4');
|
|
const _zip = require('lodash/zip');
|
|
const decrypt = require('./decrypt');
|
|
|
|
function encode(cfg, val, idx, cfgnum) {
|
|
const list = cfg[idx];
|
|
const arr = [0, 0, 0, 0];
|
|
let one = val[0] ^ list[0]
|
|
, two = val[idx ? 3 : 1] ^ list[1]
|
|
, three = val[2] ^ list[2]
|
|
, four = val[idx ? 1 : 3] ^ list[3]
|
|
, cursor = 4;
|
|
for (let i = 0; i < list.length / 4 - 2; i++) {
|
|
const none = cfgnum[0][one >>> 24] ^ cfgnum[1][two >> 16 & 255] ^ cfgnum[2][three >> 8 & 255] ^ cfgnum[3][four & 255] ^ list[cursor];
|
|
const ntwo = cfgnum[0][two >>> 24] ^ cfgnum[1][three >> 16 & 255] ^ cfgnum[2][four >> 8 & 255] ^ cfgnum[3][one & 255] ^ list[cursor + 1];
|
|
const nthree = cfgnum[0][three >>> 24] ^ cfgnum[1][four >> 16 & 255] ^ cfgnum[2][one >> 8 & 255] ^ cfgnum[3][two & 255] ^ list[cursor + 2];
|
|
four = cfgnum[0][four >>> 24] ^ cfgnum[1][one >> 16 & 255] ^ cfgnum[2][two >> 8 & 255] ^ cfgnum[3][three & 255] ^ list[cursor + 3];
|
|
cursor += 4;
|
|
[one, two, three] = [none, ntwo, nthree]
|
|
}
|
|
for (let i = 0; i < 4; i++) {
|
|
arr[idx ? 3 & -i : i] = cfgnum[4][one >>> 24] << 24 ^ cfgnum[4][two >> 16 & 255] << 16 ^ cfgnum[4][three >> 8 & 255] << 8 ^ cfgnum[4][four & 255] ^ list[cursor++];
|
|
[one, two, three, four] = [two, three, four, one];
|
|
}
|
|
return arr;
|
|
}
|
|
|
|
function getCfg(numarr) {
|
|
const ret = combine4(numarr.length % 16 !== 0 ? numarrAddTime.reverse(numarr)[0] : numarr);
|
|
const cfgnum_0_4 = gv.cfgnum[0][4];
|
|
const len = ret.length;
|
|
const arr = [];
|
|
let i, j, temp;
|
|
for (i = len, j = 1; i < 4 * len + 28; i++) {
|
|
temp = ret[i - 1];
|
|
if (i % len === 0 || len === 8 && i % len === 4) {
|
|
temp = cfgnum_0_4[temp >>> 24] << 24 ^ cfgnum_0_4[temp >> 16 & 255] << 16 ^ cfgnum_0_4[temp >> 8 & 255] << 8 ^ cfgnum_0_4[temp & 255];
|
|
if (i % len === 0) {
|
|
temp = temp << 8 ^ temp >>> 24 ^ j << 24;
|
|
j = j << 1 ^ (j >> 7) * 283;
|
|
}
|
|
}
|
|
ret[i] = ret[i - len] ^ temp;
|
|
}
|
|
for (j = 0; i; j++, i--) {
|
|
temp = ret[j & 3 ? i : i - 4];
|
|
if (i <= 4 || j < 4) {
|
|
arr[j] = temp;
|
|
} else {
|
|
arr[j] = gv.cfgnum[1][0][cfgnum_0_4[temp >>> 24]] ^ gv.cfgnum[1][1][cfgnum_0_4[temp >> 16 & 255]] ^ gv.cfgnum[1][2][cfgnum_0_4[temp >> 8 & 255]] ^ gv.cfgnum[1][3][cfgnum_0_4[temp & 255]];
|
|
}
|
|
}
|
|
return [ret, arr];
|
|
}
|
|
|
|
function encryptMode1(valarr, keyarr, flag = 1) {
|
|
const cfg = getCfg(keyarr);
|
|
var _$iv, _$j7, _$kb, _$ka, _$dV, _$du, _$jb;
|
|
const max = Math.floor(valarr.length / 16) + 1;
|
|
let ans = [], arr;
|
|
const fill = 16 - valarr.length % 16;
|
|
if (flag) {
|
|
ans = arr = new Array(4).fill(4294967295).map(it => Math.floor(Math.random() * it));
|
|
}
|
|
const copyarr = numToNumarr4.reverse_sign([...valarr, ...new Array(fill).fill(fill)]);
|
|
for (let i = 0; i < max; ) {
|
|
let current = copyarr.slice(i << 2, ++i << 2);
|
|
if (arr) {
|
|
current = [0, 1, 2, 3].map(it => current[it] ^ arr[it]);
|
|
}
|
|
arr = encode(cfg, current, 0, gv.cfgnum[0]);
|
|
for (let j = 0; j < arr.length; j++) {
|
|
ans.push(arr[j]);
|
|
}
|
|
}
|
|
return numToNumarr4(ans);
|
|
}
|
|
|
|
function encryptMode2(valarr, keyarr, flag = 1) {
|
|
const cfg = getCfg(keyarr);
|
|
const arr = [];
|
|
let arrcom = combine4(valarr);
|
|
let arrsub = [];
|
|
if (flag) {
|
|
arrsub = arrcom.slice(0, 4);
|
|
arrcom = arrcom.slice(4);
|
|
}
|
|
for (let i = 0; i < arrcom.length / 4; ) {
|
|
const next = arrcom.slice(i << 2, ++i << 2);
|
|
let val = encode(cfg, next, 1, gv.cfgnum[1]);
|
|
if (arrsub.length) {
|
|
val = _zip(val, arrsub).map(([a, b]) => a ^ b);
|
|
}
|
|
for (let j = 0; j < val.length; j++) {
|
|
arr.push(val[j]);
|
|
}
|
|
arrsub = next;
|
|
}
|
|
const ret = arr.reduce((ans, it) => ([...ans, ...numToNumarr4(it)]), []);
|
|
return ret.slice(0, ret.length - ret[ret.length - 1]);
|
|
}
|
|
|
|
module.exports = {
|
|
encryptMode1,
|
|
encryptMode2,
|
|
}
|
|
|