Created
October 6, 2016 05:23
-
-
Save t3h2mas/f294b6ad18d4ffdc75306633df22f0ac to your computer and use it in GitHub Desktop.
three.js take 2 -- cryptopals
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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