@FastSpace Javascript ES3 Decrypt / v edata response from Captcha Tiktok write by Gemini:
function stringToUtf8Array(str) {
var utf8 = [];
for (var i = 0; i < str.length; i++) {
var charcode = str.charCodeAt(i);
if (charcode < 0x80) utf8.push(charcode);
else if (charcode < 0x800) {
utf8.push(0xc0 | (charcode >> 6),
0x80 | (charcode & 0x3f));
} else if (charcode < 0xd800 || charcode >= 0xe000) {
utf8.push(0xe0 | (charcode >> 12),
0x80 | ((charcode >> 6) & 0x3f),
0x80 | (charcode & 0x3f));
} else {
i++;
charcode = 0x10000 + (((charcode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));
utf8.push(0xf0 | (charcode >> 18),
0x80 | ((charcode >> 12) & 0x3f),
0x80 | ((charcode >> 6) & 0x3f),
0x80 | (charcode & 0x3f));
}
}
return utf8;
}
function utf8ArrayToString(array) {
var out = "";
var i = 0;
var len = array.length;
var c, char2, char3;
while (i < len) {
c = array[i++];
switch (c >> 4) {
case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
out += String.fromCharCode(c);
break;
case 12: case 13:
char2 = array[i++];
out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
break;
case 14:
char2 = array[i++];
char3 = array[i++];
out += String.fromCharCode(((c & 0x0F) << 12) |
((char2 & 0x3F) << 6) |
((char3 & 0x3F) << 0));
break;
default: // Simple fallback for complex chars or errors
out += String.fromCharCode(0xFFFD); // Replacement char
}
}
return out;
}
var B64_STR = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
function base64Encode(byteArray) {
var output = "";
var i = 0;
var len = byteArray.length;
while (i < len) {
var chr1 = byteArray[i++];
var chr2 = byteArray[i++];
var chr3 = byteArray[i++];
var enc1 = chr1 >> 2;
var enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
var enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
var enc4 = chr3 & 63;
if (isNaN(chr2)) enc3 = enc4 = 64;
else if (isNaN(chr3)) enc4 = 64;
output = output + B64_STR.charAt(enc1) + B64_STR.charAt(enc2) +
B64_STR.charAt(enc3) + B64_STR.charAt(enc4);
}
return output;
}
function base64Decode(input) {
var output = [];
var chr1, chr2, chr3;
var enc1, enc2, enc3, enc4;
var i = 0;
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
while (i < input.length) {
enc1 = B64_STR.indexOf(input.charAt(i++));
enc2 = B64_STR.indexOf(input.charAt(i++));
enc3 = B64_STR.indexOf(input.charAt(i++));
enc4 = B64_STR.indexOf(input.charAt(i++));
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
output.push(chr1);
if (enc3 != 64) output.push(chr2);
if (enc4 != 64) output.push(chr3);
}
return output;
}
function getRandomBytes(len) {
var arr = [];
for (var i = 0; i < len; i++) {
arr.push(Math.floor(Math.random() * 256));
}
return arr;
}
var Cha = function (key, nonce, counter) {
if (key.length !== 32 || nonce.length !== 12) {
throw new Error("Invalid key or nonce length");
}
this.k = key;
this.n = nonce;
this.c = counter || 0;
};
Cha._r = function (v, n) {
return ((v << n) | (v >>> (32 - n))) >>> 0;
};
Cha._qr = function (s, a, b, c, d) {
s[a] = (s[a] + s[b]) >>> 0;
s[d] ^= s[a];
s[d] = Cha._r(s[d], 16);
s[c] = (s[c] + s[d]) >>> 0;
s[b] ^= s[c];
s[b] = Cha._r(s[b], 12);
s[a] = (s[a] + s[b]) >>> 0;
s[d] ^= s[a];
s[d] = Cha._r(s[d], 8);
s[c] = (s[c] + s[d]) >>> 0;
s[b] ^= s[c];
s[b] = Cha._r(s[b], 7);
};
Cha.prototype._bytesToInt = function (arr, offset) {
return (arr[offset] |
(arr[offset + 1] << 8) |
(arr[offset + 2] << 16) |
(arr[offset + 3] << 24)) >>> 0;
};
Cha.prototype._intToBytesPush = function (val, targetArray) {
targetArray.push(val & 0xff);
targetArray.push((val >>> 8) & 0xff);
targetArray.push((val >>> 16) & 0xff);
targetArray.push((val >>> 24) & 0xff);
};
Cha.prototype._block = function (ctr) {
var s = [0x61707865, 0x3320646e, 0x79622d32, 0x6b206574];
for (var i = 0; i < 8; i++) s.push(this._bytesToInt(this.k, i * 4));
s.push(ctr >>> 0);
for (var i = 0; i < 3; i++) s.push(this._bytesToInt(this.n, i * 4));
var w = s.slice(0);
for (var i = 0; i < 10; i++) {
Cha._qr(w, 0, 4, 8, 12); Cha._qr(w, 1, 5, 9, 13);
Cha._qr(w, 2, 6, 10, 14); Cha._qr(w, 3, 7, 11, 15);
Cha._qr(w, 0, 5, 10, 15); Cha._qr(w, 1, 6, 11, 12);
Cha._qr(w, 2, 7, 8, 13); Cha._qr(w, 3, 4, 9, 14);
}
var blockBytes = [];
for (var i = 0; i < 16; i++) {
this._intToBytesPush((w[i] + s[i]) >>> 0, blockBytes);
}
return blockBytes;
};
Cha.prototype._p = function (data) {
var result = [];
var dataLen = data.length;
var currentCtr = this.c;
var dataIdx = 0;
while (dataIdx < dataLen) {
var block = this._block(currentCtr);
currentCtr = (currentCtr + 1) >>> 0;
for (var i = 0; i < block.length; i++) {
if (dataIdx >= dataLen) break;
result.push(data[dataIdx] ^ block[i]);
dataIdx++;
}
}
this.c = currentCtr;
return result;
};
var edata = {
FLAG: [0x01], // b'\x01'
encrypt: function (txt) {
var d = stringToUtf8Array(txt);
var k = getRandomBytes(32);
var n = getRandomBytes(12);
var c = new Cha(k, n, 0);
var ct = c._p(d);
var raw = this.FLAG.concat(k, n, ct);
return base64Encode(raw);
},
decrypt: function (txt) {
var raw = base64Decode(txt);
if (raw.length < 45) {
throw new Error("Invalid edata");
}
var k = raw.slice(1, 33);
var n = raw.slice(33, 45);
var ct = raw.slice(45);
var c = new Cha(k, n, 0);
var plain = c._p(ct);
return utf8ArrayToString(plain);
}
};
// Decrypt
var cipherText = "Ae8Tm93oj9vmIbi/Z22dYrzR1ji3hm+63dxGUMydXhF4...."
var decryptedText = edata.decrypt(cipherText);
log(decryptedText)
// Encrypt
var originalText = "...."
var cipherText = edata.encrypt(originalText);
log(cipherText)