首页
社区
课程
招聘
[未解决,已结帖] 还原一个js函数编码的算法 1000.00雪花
发表于: 2020-3-8 11:26 2454

[未解决,已结帖] 还原一个js函数编码的算法 1000.00雪花

2020-3-8 11:26
2454
要求对以下datatrans函数编码的数据进行还原,只需要提供 datatrans函数的还原算法,datatrans函数中用到的bitArrToByteArr和toBytes函数不需要还原。

//现提供以下调用例子,能正确还原的请回贴。
datatrans([0, 1, 0], 6);

function datatrans(arr_result, int_unicode0_multi_count) {
//复制出新的数组
let arr_result_slice = arr_result.slice();
//保存原始数组长度
let arrRet_m = toBytes(0 | arr_result.length);
//添加4位1
arr_result_slice.push(1, 1, 1, 1);

let arrTmp_Ge = [];
let fun_fromCharCode = String.fromCharCode;
let fun_str_substr = "".substr;
let fun_str_indexOf = "".indexOf;
let arr_unicode_char256_U = []; 
let arr_unicode_char256_g = [];
//获取unicode值=0-255的的字符数组
for (let i = 0; i < 256; i++) {
arr_unicode_char256_g[i] = String.fromCharCode.call(String, i);
arr_unicode_char256_U[i] = arr_unicode_char256_g[i];
} //Array(256)

//数组转成字符串
var str_unicode_char256_g = arr_unicode_char256_g.join(""); 
//把第一个字符循环加int_unicode0_multi_count次
var str_unicode_0_multi = "";
for (let d = 0; d < int_unicode0_multi_count; d++) {
str_unicode_0_multi += arr_unicode_char256_U[0];
}

//循环过程中arr_unicode_char256_g会扩充
let int_D_handle_index = 0; 
let int_d_add_index = 1;
for (let i = 0; i < arr_result_slice.length; i++) {
var int_index = 255 & arr_result_slice[i];
let int_indexOf_index = fun_str_indexOf.call(str_unicode_char256_g, arr_unicode_char256_U[int_index]); //p=0
let int_indexOf_index_plus;
if (int_index === 255) {
int_indexOf_index_plus = str_unicode_char256_g.length;
} else {
//正常路径
int_indexOf_index_plus = fun_str_indexOf.call(str_unicode_char256_g, arr_unicode_char256_U[int_index + 1]); //1
}
let int_arr_unicode_char256_1_len = str_unicode_char256_g.length;
let float_divide_len = (int_d_add_index - int_D_handle_index) / int_arr_unicode_char256_1_len; 
int_d_add_index = int_D_handle_index + float_divide_len * int_indexOf_index_plus; 
int_D_handle_index += float_divide_len * int_indexOf_index;
        
        console.log('%c ' + (i + 1) + '. ' + int_index, 'color: green; font-size: 14px; font-weight:Bold');
console.log('arr_len=' + str_unicode_char256_g.length, 'index=' + int_indexOf_index, 'index+=' + int_indexOf_index_plus, 
          'd=' + int_d_add_index, 'D=' + int_D_handle_index, 'float_divide_len=' + float_divide_len);

str_unicode_char256_g = fun_str_substr.call(str_unicode_char256_g, 0, int_indexOf_index_plus)
+ str_unicode_0_multi 
+ fun_str_substr.call(str_unicode_char256_g, int_indexOf_index_plus);

        let arr_push = []; //用于打印
let int_2d;
let int_2D;
let int_2d_shr0;
let int_2D_shr0;
do {
int_2d = 2 * int_d_add_index;
int_2D = 2 * int_D_handle_index;
int_2d_shr0 = int_2d >> 0;
int_2D_shr0 = int_2D >> 0;
if (int_2d_shr0 === int_2D_shr0) {
int_d_add_index = int_2d - int_2d_shr0;
int_D_handle_index = int_2D - int_2D_shr0;
arrTmp_Ge.push(int_2d_shr0);
arr_push.push(int_2d_shr0);
}
} while (int_2d_shr0 === int_2D_shr0)
console.log("2d_shr0=" + int_2d_shr0, "2D_shr0=" + int_2D_shr0, 'arr_push(' + arr_push.length + ')=' + arr_push);
}
//位数组转换为byte数组
arrRet_m = arrRet_m.concat(bitArrToByteArr(arrTmp_Ge));

    console.log('转换结果:' + arrRet_m.join(', '));
return arrRet_m;
}

/**
 * 将byte数组转换long数组,最后不足8位的特别处理
 */
 function bitArrToByteArr(arr_byte) {
//4次循环
//把arrTmp7的8位一组转换成long保存到arrTmp10
//arrTmp10本来1个,加了4个,变成Arrar(5)
int_max_len = arr_byte.length - 8; //Array(40)
let arr_long = [];
let int_handle_index = 0;
let int_add_index = 0;
while(true) {
if (int_add_index) {
int_handle_index += 8;
}
int_add_index = 1;
if (!(int_max_len > int_handle_index)) {
break;
} else {
let long_arrTmp7_shl =
+ (arr_byte[int_handle_index] << 7)
+ (arr_byte[int_handle_index + 1] << 6)
+ (arr_byte[int_handle_index + 2] << 5)
+ (arr_byte[int_handle_index + 3] << 4)
+ (arr_byte[int_handle_index + 4] << 3)
+ (arr_byte[int_handle_index + 5] << 2)
+ (arr_byte[int_handle_index + 6] << 1)
+ (arr_byte[int_handle_index + 7]); //0
arr_long.push(long_arrTmp7_shl);
}
}

//循环后D=32
//把arrTmp7 32位后的值循环左移后push到arrTmp10
//把D
//把后面<=8的位另外转换
if (arr_byte.length > int_handle_index) {
let int_result_A = 0;
let int_ye_count = 0;
let int_w_add_index = 0;
while (true) {
if (int_w_add_index) {
int_ye_count += 1;
int_handle_index += 1;
int_w_add_index = 1;
if (!(8 > int_ye_count)) {
arr_long.push(int_result_A);
break;
} else {
int_result_A <<= 1;
if (arr_byte.length > int_handle_index) {
int_result_A += arr_byte[int_handle_index];
}
}
}
return arr_long;
 }

 /**
 * 把整型转化成转化成数组,每7位转化为1位
 */
function toBytes(int_or0) {
let arrRet = void 0;
if (16384 > int_or0) {
let int_continue = 0;
int_or0 = 0 | int_or0;
if (128 > int_or0) {
let arrTmpTmp = [];
arrTmpTmp.push(int_or0);
arrRet = arrTmpTmp;
} else {
if (!int_continue) {
let int_or0_high7 = ((int_or0 - (int_or0 % 128)) / 128) & 127; //(商)
let int_or0_low7 = int_or0 % 128 + 128; //(余数+128)
let arrTmpTmp = [];
arrTmpTmp.push(int_or0_low7, int_or0_high7); 
arrRet = arrTmpTmp;
} else {
let arrTmpTmp = [];

while (true) {
let int_or0_and127 = int_or0 & 127;
int_or0 >>= 7;
if (int_or0) {
int_or0_and127 = 128 | int_or0_and127;
}
arrTmpTmp.push(int_or0_and127);
if (!int_or0) {
break;
} else {
}
}
arrRet = arrTmpTmp;
}
return arrRet;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 489
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
2
付费问答的问题如果没人能解决,能退款吗?
我第一次使用付费问答,刚花了1000块钱发一个问题,如果没人能解决是不是可申请退款?现贴还在待审核中,如果不能退款的话,请帮忙不要通过,我申请退款,谢谢!
2020-3-8 12:58
0
雪    币: 7796
活跃值: (3500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不好还原,感觉这个方法就是个不可逆转换,如果是什么软件的加密算法,我估计他们自己都没法解密
2020-3-9 08:44
0
雪    币: 489
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
从原来设计的角度,感觉应该能还原,这个算法是不是有点类似压缩。请大神认真看一下,钱可加。
2020-3-9 15:21
0
雪    币: 7796
活跃值: (3500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
能不能说明一下是哪个软件里的逻辑还是?
2020-3-9 22:39
0
雪    币: 8447
活跃值: (5041)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
6
私信我
2020-3-10 10:42
0
雪    币: 4390
活跃值: (4378)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这肯定是可以还原的算法.不用置疑
2020-3-10 11:10
0
雪    币: 489
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
8
Mxixihaha,大神,那要怎么还原啊!
2020-3-12 10:30
0
雪    币: 489
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
9
看雪上这么多大神,能不能帮助搞一下,钱可加。
2020-3-13 15:44
0
雪    币: 275
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
2020-3-13 20:08
0
雪    币: 489
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
11
看雪上这么多大神,能不能帮助搞一下,钱可加。
2020-3-14 20:11
0
雪    币: 489
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
12
从设计者的意图来看,这个算法应该是可逆的,大神们帮忙看看吧!
2020-3-14 20:12
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
经测,此算法为不可逆算法。如果非要破解,只有暴力破解法。 
datatrans([1,7],42):[2,1,42,24]
datatrans([1,2],48):[2,1,42,24]
datatrans([1,3],59):[2,1,50,96]
datatrans([1,7],54):[2,1,50,96]
2020-3-17 15:20
0
游客
登录 | 注册 方可回帖
返回
//