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...