X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=cipher.py;h=b07cd250fb8263e338a1b35686f28a583f9bf2a2;hb=0a8d248c149a8499fc9b92e8ea7a5f4780be4d76;hp=b3ab488db74c3af8090aefcc2396c2d503725064;hpb=3b82269b94de43fa0150fe5b34ca39b4ba3b6ba4;p=cipher-tools.git diff --git a/cipher.py b/cipher.py index b3ab488..b07cd25 100644 --- a/cipher.py +++ b/cipher.py @@ -17,6 +17,21 @@ def letter_frequencies(message): frequencies[letter]+=1 return frequencies +def scale_freq(frequencies): + total= sum(frequencies.values()) + scaled_frequencies = collections.defaultdict(int) + for letter in frequencies.keys(): + scaled_frequencies[letter] = frequencies[letter] / total + return scaled_frequencies + +def value_diff(frequencies1, frequencies2): + total= 0 + for letter in frequencies1.keys(): + total += abs(frequencies1[letter]-frequencies2[letter]) + return total + + + def caesar_cipher_letter(letter, shift): if letter in string.ascii_letters: if letter in string.ascii_lowercase: @@ -37,3 +52,17 @@ def caesar_cipher_message(message, shift): def caesar_decipher_message(message, shift): return caesar_cipher_message(message, -shift) + +def caesar_break(message): + best_key = 0 + best_fit = float("inf") + for shift in range(26): + plaintxt = caesar_decipher_message(message, shift) + lettertxt = letter_frequencies(plaintxt) + total1 = scale_freq(lettertxt) + total2 = scale_freq(english_counts) + fit = value_diff(total2, total1) + if fit < best_fit: + best_key = shift + best_fit = fit + return best_key