One Time Pad
by mifeng
HTML
http://travisdazell.blogspot.hk/2012/11/many-time-pad-attack-crib-drag.html
JavaScript
function toHex(text) {
return text.split("").map(function(c) {
return c.charCodeAt().toString(16);
}).join("");
}
function toASCII(hex) {
return hex.match(/../g).map(function(h) {
return String.fromCharCode(parseInt(h, 16));
}).join("");
}
function xor(h1, h2) {
var result = "";
for (var i = 0; i < h1.length; i += 2) {
var h1c = h1.slice(i, i + 2),
h2c = h2.slice(i % h2.length, (i + 2) % (h2.length + 2)),
xor = parseInt(h1c, 16) ^ parseInt(h2c, 16);
result += ("0" + xor.toString(16)).slice(-2);
}
return result;
}
//var guess = " YOU WOULD HAVE THEM DO UNTO YOU";
//var guess = "NS OUT THAT MAKING THESE CHALLENGES IS VERY DIFFICULT.";
var guess = "QUOTE: DO UNTO OTHERS AS YOU WOULD HAVE THEM DO UNTO YOU.";
var key = "It's the eye of the tiger It's the thrill of the fight Ri";
var position = 0;//48; // 48
var cipher1 = "18216827654e48216f452c2b7420466f20202072274926365279062107246f212421003c29242c4c38682a2b0030274575283d28482d6f0747";
var cipher2 = "0020072775262636002a2c31003b2e61204828613f202922527401317436003720246c382d3c2e293f00263500222d3779462d2e2e3269113c";
var gh = toHex(guess);
var cc = xor(cipher1, cipher2);
console.log("===========");
console.log("cipher chars: " + cipher1.length / 2);
console.log("guess chars: " + guess.length);
console.log("guessing: " + guess);
// matching xor
function match(i) {
var gr = xor(gh, cc.slice(i, i + gh.length));
console.log("CHAR[" + i/2 + "]:" + toASCII(gr));
}
// brutal guess
function brutal() {
var ALPHA = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var POS = 48;
var original_guess = guess;
for (var k = 0; k < ALPHA.length; k += 1) {
}
}
// manual guess
function manual() {
if (position) { match(position); }
else {
for (var i = 0; i <= cc.length - gh.length; i += 2) {
match(i);
}
}
}
manual();