Advertisement
Guest User

cryptology25_frequencyanalysis.py

a guest
Feb 18th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.69 KB | None | 0 0
  1. # Turing Team
  2. # https://t.me/turing_team
  3. # Cryptology #25
  4. # Frequency Cryptanalysis
  5.  
  6. from string import ascii_uppercase
  7.  
  8. ETAOIN = 'ETAOINSHRDLCUMWFGYPBVKJXQZ'
  9.  
  10. def get_letter_count(text):
  11.     letter_count = {
  12.         'A': 0, 'B': 0, 'C': 0, 'D': 0, 'E': 0,
  13.         'F': 0, 'G': 0, 'H': 0, 'I': 0, 'J': 0,
  14.         'K': 0, 'L': 0, 'M': 0, 'N': 0, 'O': 0,
  15.         'P': 0, 'Q': 0, 'R': 0, 'S': 0, 'T': 0,
  16.         'U': 0, 'V': 0, 'W': 0, 'X': 0, 'Y': 0,
  17.         'Z': 0
  18.     }
  19.  
  20.     for letter in text.upper():
  21.         if letter in LETTERS:
  22.             letter_count[letter] += 1
  23.  
  24.     return letter_count
  25.  
  26. def get_zero_item(items):
  27.     return items[0]
  28.  
  29. def get_freq_order(text):
  30.     letter_to_freq = get_letter_count(text)
  31.     freq_to_letter = {}
  32.  
  33.     for letter in LETTERS:
  34.         if letter_to_freq[letter] not in freq_to_letter:
  35.             freq_to_letter[letter_to_freq[letter]] = [letter]
  36.         else:
  37.             freq_to_letter[letter_to_freq[letter]].append(letter)
  38.  
  39.     for freq in freq_to_letter:
  40.         freq_to_letter[freq].sort(key=ETAOIN.find, reverse=True)
  41.         freq_to_letter[freq] = ''.join(freq_to_letter[freq])
  42.  
  43.     freq_pairs = list(freq_to_letter.items())
  44.     freq_pairs.sort(key=get_zero_item, reverse=True)
  45.  
  46.     freq_order = []
  47.     for freq_pair in freq_pairs:
  48.         freq_order.append(freq_pair[1])
  49.  
  50.     return ''.join(freq_order)
  51.  
  52.  
  53. def get_freq_score(text):
  54.     freq_order = get_freq_order(text)
  55.     score = 0
  56.  
  57.     for common_letter in ETAOIN[:6]:
  58.         if common_letter in freq_order[:6]:
  59.             score += 1
  60.  
  61.     for uncommon_letter in ETAOIN[-6:]:
  62.         if uncommon_letter in freq_order[-6:]:
  63.             score += 1
  64.  
  65.     return score
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement