Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- "use strict";
- function Encrypt(message, shift, alphabet) {
- let loweredMessage = message.toLowerCase();
- let wordToIndexAlphabetDict = CreateDictionaryWordToIndex(alphabet);
- let result = [];
- for (let i = 0; i < loweredMessage.length; i++) {
- let letter = loweredMessage[i];
- result.push(ShiftWord(letter, alphabet, wordToIndexAlphabetDict, shift))
- }
- return result.join('');
- }
- function Decrypt(message, shift, alphabet) {
- let new_shift = -shift;
- let result = Encrypt(message, new_shift, alphabet);
- return result;
- }
- function DecryptBruteForce(message, lettersFreq, alphabet) {
- let shift = CrackShift(message, lettersFreq, alphabet);
- return Decrypt(message, shift, alphabet);
- }
- function CreateDictionaryWordToIndex(alphabet) {
- let dict = {};
- for (let i = 0; i < alphabet.length; i++) {
- dict[alphabet[i]] = i;
- }
- return dict;
- }
- function ShiftWord(letter, alphabet, wordToIndexDict, shift) {
- if (wordToIndexDict[letter]) {
- let newIndex = (wordToIndexDict[letter] + shift + alphabet.length) % alphabet.length;
- return alphabet[newIndex];
- } else {
- return letter;
- }
- }
- function CrackShift(message, lettersFreq, alphabet) {
- let wordToIndexAlphabetDict = CreateDictionaryWordToIndex(alphabet);
- let actualFreq = GetFrequencyDictionary(message, alphabet);
- let minimalDiff = +Infinity;
- let minDiffShiftValue = 0;
- for (let shift = 1; shift < alphabet.length; shift++) {
- let diff = CalculateDiff(shift, alphabet, actualFreq, lettersFreq, wordToIndexAlphabetDict);
- if (diff < minimalDiff) {
- minimalDiff = diff;
- minDiffShiftValue = shift;
- }
- }
- return minDiffShiftValue;
- }
- function GetFrequencyDictionary(text, alphabet) {
- let wordToIndexAlphabetDict = CreateDictionaryWordToIndex(alphabet);
- let freq = {};
- let alphabetSymbolsCount = 0;
- for (let i = 0; i < text.length; i++) {
- let letter = text[i];
- if (wordToIndexAlphabetDict[letter] + 1) {
- freq[letter] ? freq[letter] += 1 : freq[letter] = 1;
- alphabetSymbolsCount++;
- }
- }
- for (let i = 0; i < alphabet.length; i++) {
- freq[alphabet[i]] = freq[alphabet[i]] ? (freq[alphabet[i]] * 100) / alphabetSymbolsCount : 0;
- }
- return freq;
- }
- function CalculateDiff(shift, alphabet, actualFreq, lettersFreq, wordToIndexAlphabetDict) {
- let diff = 0;
- for(let i = 0; i < alphabet.length; i++) {
- let letter = alphabet[i];
- diff += (actualFreq[ShiftWord(letter, alphabet, wordToIndexAlphabetDict, shift)] - lettersFreq[letter]) ** 2;
- }
- return diff;
- }
- test();
- function test() {
- const fs = require('fs');
- let alphabet =
- ["a", "b", "c", "d", "e", "f", "g", "h", "i",
- "j", "k", "l", "m", "n", "o", "p", "q", "r",
- "s", "t", "u", "v", "w", "x", "y", "z"];
- let frequencyOfEnglishLetters = {
- "a": 8.17, "b": 1.49, "c": 2.78, "d": 4.25, "e": 12.7, "f": 2.23,
- "g": 2.02, "h": 6.09, "i": 6.97, "j": 0.15, "k": 0.77, "l": 4.03,
- "m": 2.41, "n": 6.75, "o": 7.51, "p": 1.93, "q": 0.10, "r": 5.99,
- "s": 6.33, "t": 9.06, "u": 2.76, "v": 0.98, "w": 2.36, "x": 0.15,
- "y": 1.97, "z": 0.05};
- let message = fs.readFileSync("message.txt", "utf8");
- let shift = -2;
- let encrypted = Encrypt(message, shift, alphabet);
- let decrypted = Decrypt(encrypted, shift, alphabet);
- let decryptedBrutally = DecryptBruteForce(encrypted, frequencyOfEnglishLetters, alphabet);
- console.log(decryptedBrutally == decrypted);
- console.log("Encrypted message:\n")
- console.log(encrypted);
- console.log("\nPrevious encrypted message but decrypted:\n")
- console.log(decrypted);
- }
Add Comment
Please, Sign In to add comment