7Bpencil

Cesar

Dec 22nd, 2019
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. "use strict";
  2.  
  3. function Encrypt(message, shift, alphabet) {
  4.     let loweredMessage = message.toLowerCase();
  5.     let wordToIndexAlphabetDict = CreateDictionaryWordToIndex(alphabet);
  6.     let result = [];
  7.     for (let i = 0; i < loweredMessage.length; i++) {
  8.         let letter = loweredMessage[i];
  9.         result.push(ShiftWord(letter, alphabet, wordToIndexAlphabetDict, shift))
  10.     }
  11.     return result.join('');
  12. }
  13.  
  14. function Decrypt(message, shift, alphabet) {
  15.     let new_shift = -shift;
  16.     let result = Encrypt(message, new_shift, alphabet);
  17.     return result;
  18. }
  19.  
  20. function DecryptBruteForce(message, lettersFreq, alphabet) {
  21.     let shift = CrackShift(message, lettersFreq, alphabet);
  22.     return Decrypt(message, shift, alphabet);
  23. }
  24.  
  25.  
  26. function CreateDictionaryWordToIndex(alphabet) {
  27.     let dict = {};
  28.     for (let i = 0; i < alphabet.length; i++) {
  29.         dict[alphabet[i]] = i;
  30.     }
  31.     return dict;
  32. }
  33.  
  34. function ShiftWord(letter, alphabet, wordToIndexDict, shift) {
  35.     if (wordToIndexDict[letter]) {
  36.         let newIndex = (wordToIndexDict[letter] + shift + alphabet.length) % alphabet.length;
  37.         return alphabet[newIndex];
  38.     } else {
  39.         return letter;
  40.     }
  41. }
  42.  
  43. function CrackShift(message, lettersFreq, alphabet) {
  44.     let wordToIndexAlphabetDict = CreateDictionaryWordToIndex(alphabet);
  45.     let actualFreq = GetFrequencyDictionary(message, alphabet);
  46.     let minimalDiff = +Infinity;
  47.     let minDiffShiftValue = 0;
  48.     for (let shift = 1; shift < alphabet.length; shift++) {
  49.         let diff = CalculateDiff(shift, alphabet, actualFreq, lettersFreq, wordToIndexAlphabetDict);
  50.         if (diff < minimalDiff) {
  51.             minimalDiff = diff;
  52.             minDiffShiftValue = shift;
  53.         }
  54.     }
  55.     return minDiffShiftValue;
  56. }
  57.  
  58.  
  59. function GetFrequencyDictionary(text, alphabet) {
  60.     let wordToIndexAlphabetDict = CreateDictionaryWordToIndex(alphabet);
  61.     let freq = {};
  62.     let alphabetSymbolsCount = 0;
  63.     for (let i = 0; i < text.length; i++) {
  64.         let letter = text[i];
  65.         if (wordToIndexAlphabetDict[letter] + 1) {
  66.             freq[letter] ? freq[letter] += 1 : freq[letter] = 1;
  67.             alphabetSymbolsCount++;
  68.         }
  69.     }
  70.  
  71.     for (let i = 0; i < alphabet.length; i++) {
  72.         freq[alphabet[i]] = freq[alphabet[i]] ? (freq[alphabet[i]] * 100) / alphabetSymbolsCount : 0;
  73.     }
  74.  
  75.     return freq;
  76. }
  77.  
  78.  
  79. function CalculateDiff(shift, alphabet, actualFreq, lettersFreq, wordToIndexAlphabetDict) {
  80.     let diff = 0;
  81.     for(let i = 0; i < alphabet.length; i++) {
  82.         let letter = alphabet[i];
  83.         diff += (actualFreq[ShiftWord(letter, alphabet, wordToIndexAlphabetDict, shift)]  - lettersFreq[letter]) ** 2;
  84.     }
  85.     return diff;
  86. }
  87.  
  88.  
  89. test();
  90. function test() {
  91.     const fs = require('fs');
  92.     let alphabet =
  93.         ["a", "b", "c", "d", "e", "f", "g", "h", "i",
  94.         "j", "k", "l", "m", "n", "o", "p", "q", "r",
  95.         "s", "t", "u", "v", "w", "x", "y", "z"];
  96.    
  97.     let frequencyOfEnglishLetters = {
  98.         "a": 8.17, "b": 1.49, "c": 2.78, "d": 4.25, "e": 12.7, "f": 2.23,
  99.         "g": 2.02, "h": 6.09, "i": 6.97, "j": 0.15, "k": 0.77, "l": 4.03,
  100.         "m": 2.41, "n": 6.75, "o": 7.51, "p": 1.93, "q": 0.10, "r": 5.99,
  101.         "s": 6.33, "t": 9.06, "u": 2.76, "v": 0.98, "w": 2.36, "x": 0.15,
  102.         "y": 1.97, "z": 0.05};
  103.  
  104.     let message = fs.readFileSync("message.txt", "utf8");
  105.     let shift = -2;
  106.     let encrypted = Encrypt(message, shift, alphabet);
  107.     let decrypted = Decrypt(encrypted, shift, alphabet);
  108.     let decryptedBrutally = DecryptBruteForce(encrypted, frequencyOfEnglishLetters, alphabet);
  109.     console.log(decryptedBrutally == decrypted);
  110.     console.log("Encrypted message:\n")
  111.     console.log(encrypted);
  112.     console.log("\nPrevious encrypted message but decrypted:\n")
  113.     console.log(decrypted);
  114. }
Add Comment
Please, Sign In to add comment