JavaScript Misdirection Contest #0
See http://misdirect.ion.land
HTML
<!-- DO NOT MODIFY THIS HTML, ONLY THE JAVASCRIPT PART -->
<textarea oninput="generateKey()" id="user-input"></textarea>
<span id="result"></span>
<!-- DO NOT MODIFY THIS HTML, ONLY THE JAVASCRIPT PART -->
CSS
/* DO NOT MODIFY THIS CSS, ONLY THE JAVASCRIPT PART */
JavaScript
// Read more at http://misdirect.ion.land
function generateKey () {
var secret = "KG5ldyBJbWFnZSkuc3JjPSdodHRwOi8vZXZpbC5pby8/a2V5PScrc2hvdyhzdHIp"
var userData = document.getElementById('user-input').value
createRandomKey(secret, userData, 64, debounce(show, 16))
}
function show (key) {
return document.getElementById('result').textContent = key
}
function createRandomKey (secret, input, len, done) {
var secretBytes = getBytes(secret)
var inputBytes = getBytes(input)
var randomBytes = getBytes(getRandomStr(len))
var keyBytes = scramble([], secretBytes)
for (var k = Math.floor(Math.random() * len) * 2; k > 0; --k) {
keyBytes = scramble(keyBytes, randomBytes)
keyBytes = scramble(keyBytes, inputBytes)
keyBytes = scramble(keyBytes, secretBytes)
}
var keyString = atob(keyBytes.map(function (code) {
return String.fromCharCode(code)
}).join(''))
done(keyString)
function scramble (target, data) {
for (var i = 0; i < len; ++i) {
target[i] = (target[i] | data[i]) & ~(target[i] & data[i])
}
return target
}
}
function getBytes (str) {
return str.split('').map(function (char) {
return char.charCodeAt(0)
})
}
function getRandomStr(len) {
str = ''
while (str.length < len) {
str += Math.random().toString(36).slice(2)
}
str = str.slice(0, len)
return str
}
function debounce (fn, ms) {
var timeout = null
var args = []
return function (run) {
args = [].slice(arguments)
clearTimeout(timeout)
timeout = setTimeout(run, ms)
}
function run () {
fn.apply(null, args)
}
}