Skip to content

Instantly share code, notes, and snippets.

@t3h2mas
Created October 6, 2016 05:23
Show Gist options
  • Save t3h2mas/f294b6ad18d4ffdc75306633df22f0ac to your computer and use it in GitHub Desktop.
Save t3h2mas/f294b6ad18d4ffdc75306633df22f0ac to your computer and use it in GitHub Desktop.
three.js take 2 -- cryptopals
const xor = (str, key) =>
Buffer.from(str, 'hex').map(byte => byte ^ key);
const getFreq = (str) =>
str.toLowerCase().split('').reduce((result, item) => {result[item] = (result[item] || 0) + 1; return result}, {});
const weightFreq = (str) => {
const letterWeights = {
e: 0.12702,
t: 0.09056,
a: 0.08167,
o: 0.07507,
i: 0.06966,
n: 0.06749,
s: 0.06327,
h: 0.06094,
r: 0.05987,
d: 0.04253,
l: 0.04025,
u: 0.02758
};
const len = str.length;
const letterFreq = getFreq(str);
const percentages = {};
let score = 0;
/*
* find the % of each letter in the message
*/
Object.keys(letterFreq).map(letter => {
percentages[letter] = letterFreq[letter] / len;
});
/*
* score the distance of ETAOIN SHRDLU
*/
Object.keys(letterWeights).map(letter => {
if (!percentages.hasOwnProperty(letter)) {
return false;
}
// score = absolute distance from percentages and weights
score += Math.abs(letterWeights[letter] - percentages[letter]);
});
return score;
}
const findMessage = (msg) => {
let start = 'a'.charCodeAt(0);
let end = 'z'.charCodeAt(0);
for (let i = start; i < (end + 1); i++) {
console.log(i.toString() + ' (' + String.fromCharCode(i) + ')');
// console.log(xor(msg, i)); // hex
let msgStr = xor(msg, i).toString();
console.log(weightFreq(msgStr));
console.log(xor(msg, i).toString().toLowerCase());
}
}
const msg = '1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736';
findMessage(msg);
module.exports = weightFreq;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment