JSFiddle - React, Tailwind, and code Playground
by Csaba Hellinger
JavaScript
const secret = "hellobello";
const xor = (text, key) =>
text
.split("")
.map((char, index) =>
String.fromCharCode(
char.charCodeAt(0) ^ key.charCodeAt(index % key.length)
)
)
.join("");
const generate = (text) => {
const names = [
"atob",
"split",
"",
"map",
"String",
"fromCharCode",
"charCodeAt",
"length",
"join",
];
const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
const randomChar = () => chars[Math.trunc(Math.random() * chars.length)];
const partLen = 3;
const keyLen = partLen * 5;
const params = names.map((name) =>
name
.split("")
.map((nameChar) =>
Array(partLen)
.fill()
.map((_, index) => (index ? randomChar() : nameChar))
.join("")
)
.join("")
);
const key = Array(keyLen).fill().map(randomChar).join("");
params.push(key);
params.push(btoa(xor(text, key))); // TODO: make the key random and include it in params
console.log("params:", params);
return params;
};
const params = generate(secret);
// this code will be generated ------------------------------------------------------------------------------------
const unpack = (params) => {
// unpack params
const partLen = 3; // TODO: pass it in?
const payload = params.pop();
const key = params.pop();
const [
ATOB,
SPLIT,
EMPTY,
MAP,
STRING,
FROMCHARCODE,
CHARCODEAT,
LENGTH,
JOIN,
] = params.map((param) =>
[...param].filter((c, i) => !(i % partLen)).join("")
);
// 1. undo base64
const step1 = window[ATOB](payload);
// 2. undo xor
const step2 = step1[SPLIT](EMPTY)
[MAP]((c, i) =>
window[STRING][FROMCHARCODE](
c[CHARCODEAT](0) ^ key[CHARCODEAT](i % key[LENGTH])
)
)
[JOIN](EMPTY);
console.log("result", step2);
};
unpack(params);
// temp utils...