JSFiddle - React, Tailwind, and code Playground
HTML
<script src="http://jamiebibbs.com/hosted/md5.js"></script>
<p>Enter save game:</p>
<textarea id="input" cols="100" rows="50" type="text"></textarea>
<div><button id="decodeButton">Decode</button></div>
<p>JSON Result:</p>
<textarea id="output" cols="100" rows="50" type="text"></textarea>
<p>Enter and change json result:</p>
<textarea id="jsonInput" cols="100" rows="50" type="text"></textarea>
<div><button id="encodeButton">Encode</button></div>
<p>You save game:</p>
<textarea id="jsonOutput" cols="100" rows="50" type="text"></textarea>
CSS
#output{margin-bottom:200px}
JavaScript
const ANTI_CHEAT_CODE = 'Fe12NAfA3R6z4k0z';
const SALT = 'af0ik392jrmt0nsfdghy0';
const CHARACTERS = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM';
var input = document.getElementById('input');
var output = document.getElementById('output');
var jsonInput = document.getElementById('jsonInput');
var jsonOutput = document.getElementById('jsonOutput');
var decodeButton = document.getElementById('decodeButton');
var encodeButton = document.getElementById('encodeButton');
decodeButton.addEventListener('click', onDecodeButtonClick);
encodeButton.addEventListener('click', onEncodeButtonClick);
function onDecodeButtonClick(event)
{
var string = input.value;
var antiCheatCodeIndex = string.search(ANTI_CHEAT_CODE);
var antiCheatCodeExist = (antiCheatCodeIndex != -1);
if (antiCheatCodeExist) string = fromAntiCheatFormat(string);
output.value = atob(string);
}
function fromAntiCheatFormat(string)
{
var elements = string.split(ANTI_CHEAT_CODE);
var data = unSprinkle(elements[0]);
var hash = elements[1];
var dataHash = getHash(data);
if (dataHash = hash) return data;
alert("Hash is bad");
}
function unSprinkle(string)
{
var array = string.split("");
var result = [];
var counter = 0;
while (counter < array.length)
{
result[counter / 2] = array[counter];
counter += 2;
}
return result.join("");
}
function getHash(string)
{
var charaters = string.split();
charaters.sort();
var sortedCharaters = charaters.join();
return CryptoJS.MD5(sortedCharaters + SALT);
}
function onEncodeButtonClick(event)
{
var string = jsonInput.value;
var base64string = btoa(string);
var result = sprinkle(base64string) + ANTI_CHEAT_CODE + getHash(base64string);
jsonOutput.value = result;
}
function sprinkle(string)
{
var characters;
var randomIndex;
var array = string.split("");
var result = [];
var counter = 0;
while (counter <...