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