-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathenc_code.html
127 lines (124 loc) · 4.16 KB
/
enc_code.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<script>
/*
Функция, шифрующая сообщение
str — строка, которую нужно зашифровать.
ВК дополнительно проверяет, начинается ли строка с "http"
ops — массив объектов с операциями.
Виды операций:
reverse — строка в обратном порядке
caesar — шифр цезаря, аргумент 1 — число [0, 130]
xor — исключающее или, аргумент 1 — строка,
первый символ которой '\x00'-'\xFF' кроме "\x09" и "\x11"
shuffle — перемешивание строки, аргумент 1 — число
shuffle_id — аналогично предыдущей операции, но используется
исключающее или аргумента с id пользователя ВК
id - id пользователя ВК для операции shuffle_id
Пример:
encode("http://toster.ru",
[
{"name":"xor", "args":["1"]},
{"name":"caesar", "args":[130]},
{"name":"xor", "args":["1"]},
{"name":"reverse"},
{"name":"shuffle", "args":[1000]},
{"name":"shuffle", "args":[-11]},
{"name":"shuffle_id", "args":[22]}
],
12345
)
Результат: ["C3rOlZPOCNr0CNaVlM91zq", "EaSXcxilmtmWcxGlmqL2cxmlmtaWmaLZcYOXmqLPcZiY"]
*/
function encode(str, ops, vk_id){
var op_map = {"reverse": "v", "caesar": "r", "xor": "x", "shuffle": "s", "shuffle_id": "i"};
var proc_ops = [];
for(var i = 0; i < ops.length; i++){
switch(ops[i]["name"]){
case "reverse": str = reverse(str); break;
case "caesar": str = crypt_caesar(str, -ops[i]["args"][0]); break;
case "xor": str = crypt_xor(str, ops[i]["args"][0]); break;
case "shuffle": str = shuffle(str, ops[i]["args"][0]); break;
case "shuffle_id": str = shuffle(str, ops[i]["args"][0] ^ vk_id); break;
}
var proc_op = [];
proc_op.push(op_map[ops[i]["name"]]);
if("args" in ops[i]){
proc_op=proc_op.concat(ops[i]["args"]);
}
proc_ops.push(proc_op.join(String.fromCharCode(11)));
}
var enc_str = main_enc(str);
var enc_ops = main_enc(proc_ops.join(String.fromCharCode(9)));
return [enc_str, enc_ops];
}
/*Функция формирует URL по результату вызова предыдущей функции*/
function form_url(vals){
return "https://vk.com/mp3/audio_api_unavailable.mp3?extra="
+ vals[0] + "#" + vals[1];
}
var vk_str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN0PQRSTUVWXYZO123456789+/=";
function main_enc(str){
var shifts = [4,2,0];
var prev_i = 0;
var res = [];
var ind2 = (Math.floor(str.length / 3)) * 4 +
(((str.length % 3) == 0) ? -1 : (str.length % 3));
for(var ind = str.length; ind--; ){
var ch = str[ind].charCodeAt(0);
var shift = shifts[((ind) % 3)];
prev_i = (ch << shift) | prev_i;
var res_ch = (prev_i) & 63;
res.unshift(vk_str[res_ch]);
prev_i = prev_i >> 6;
ind2--;
if((ind2 % 4) == 0){
res_ch = (prev_i) & 63;
res.unshift(vk_str[res_ch]);
prev_i = 0;
ind2--;
}
}
return res.join("");
}
function reverse(t) {
return t.split("").reverse().join("")
}
function crypt_caesar(t, i) {
t = t.split("");
if(i < 0){
i += 65;
}
var double_str = vk_str + vk_str;
for (var j = t.length; j >= 0; j--){
var index = double_str.indexOf(t[j]);
if(index != -1) {
t[j] = double_str.substr(index - i, 1);
}
}
return t.join("")
}
function crypt_xor(t, i) {
var e = [];
return i = i.charCodeAt(0),
t.split("").forEach(function(o) {
e.push(String.fromCharCode(o.charCodeAt(0) ^ i))
}),
e.join("")
}
function shuffle(str, arg){
var len = str.length;
var cur = Math.abs(arg);
var shuffle_pos = [];
for(var i = len - 1; i >= 0; i--){
cur = (len * (i + 1) ^ (cur + i)) % len;
shuffle_pos.unshift(cur);
}
var strArr = str.split('');
for(var i = 1; i < len; i++){
var offset = shuffle_pos[i - 1];
var prev = strArr[len - i];
strArr[len - i] = strArr[offset];
strArr[offset] = prev;
}
return strArr.join('');
}
</script>