JSFiddle - React, Tailwind, and code Playground

HTML

<body onload="ReadFile();">
	<input type="file" />
	<button onclick="ReadFile();">Decrypt</button>
	<br/>
	<textarea cols="40" rows="10"></textarea>
</body>

JavaScript

function bitSwap(byte)
{
	return (byte >> 1) | (
		((byte ^ (
			((byte ^ ((byte ^ (byte << 4)) << 1)) << 1) & 0xFF
		)) & 0x40) << 1
	);
}

function decrypt(buffer, len, key)
{
	var tmp;

	if (len)
	{
		for (var i = 0; i < len; i++)
		{
			tmp = bitSwap(key);
			buffer[i] ^= tmp;
			key = tmp;
		}
	}
	return key;
}

/************ Helper functions ************/

function readFileAsArrayBuffer(file, success, error)
{
	var fr = new FileReader();
	fr.addEventListener('error', error, false);
	if (fr.readAsBinaryString)
	{
		fr.addEventListener('load', function ()
		{
			var string = this.resultString != null ? this.resultString : this.result;
			var result = new Uint8Array(string.length);
			for (var i = 0; i < string.length; i++)
			{
				result[i] = string.charCodeAt(i);
			}
			success(result.buffer);
		}, false);
		return fr.readAsBinaryString(file);
	}
	else
	{
		fr.addEventListener('load', function ()
		{
			success(this.result);
		}, false);
		return fr.readAsArrayBuffer(file);
	}
}

function downloadURL(data, fileName)
{
	var a;
	a = document.createElement('a');
	a.href = data;
	a.download = fileName;
	document.body.appendChild(a);
	a.style = 'display: none';
	a.click();
	a.remove();
};

function downloadBlob(data, fileName, mimeType)
{
	var blob, url;
	blob = new Blob([data],
	{
		type: mimeType
	});
	url = window.URL.createObjectURL(blob);
	downloadURL(url, fileName);
	setTimeout(function()
	{
		return window.URL.revokeObjectURL(url);
	}, 1000);
};

/************ Main logic ************/

function FindMagicByte(b, d)
{
	var x = b ^ d;
	for (var i = 0; i < 256; i++)
		if (bitSwap(i) == x)
			return i;
	return 0; // unreachable
}

function GetString(array, len)
{
	var s = '';
	for (var i = 0; i < len; i++)
	{
		s += String.fromCharCode(array[i]);
	}
	return s;
}

function Process(array, output)
{
	var x = FindMagicByte(array[0] + 256, 'R'.charCodeAt(0));
	magicByte = decrypt(array, array.length, x);

	if (GetString(array, 4) == 'RIFF')
	{
		output.value =...