Implementing and solving vigenere and beaufort ciphers
authorNeil Smith <neil.git@njae.me.uk>
Mon, 14 Jul 2014 19:00:03 +0000 (20:00 +0100)
committerNeil Smith <neil.git@njae.me.uk>
Mon, 14 Jul 2014 19:00:03 +0000 (20:00 +0100)
cipherbreak.py

index 1adebe671c17fdc029d28746c67328b208d462f3..9ce80005f7bff21fd7ac8de3a0b227ac62bc4754 100644 (file)
@@ -186,51 +186,6 @@ def keyword_break_worker(message, keyword, wrap_alphabet, fitness):
                      wrap_alphabet, fit, sanitise(plaintext)[:50]))
     return (keyword, wrap_alphabet), fit
 
-def monoalphabetic_break_hillclimbing(message, max_iterations=10000000, 
-        fitness=Pletters):
-    ciphertext = unaccent(message).lower()
-    alphabet = list(string.ascii_lowercase)
-    random.shuffle(alphabet)
-    alphabet = ''.join(alphabet)
-    return monoalphabetic_break_hillclimbing_worker(ciphertext, alphabet,
-                                                    max_iterations, fitness)
-
-def monoalphabetic_break_hillclimbing_mp(message, workers=10, 
-        max_iterations = 10000000, fitness=Pletters, chunksize=1):
-    worker_args = []
-    ciphertext = unaccent(message).lower()
-    for i in range(workers):
-        alphabet = list(string.ascii_lowercase)
-        random.shuffle(alphabet)
-        alphabet = ''.join(alphabet)
-        worker_args.append((ciphertext, alphabet, max_iterations, fitness))
-    with Pool() as pool:
-        breaks = pool.starmap(monoalphabetic_break_hillclimbing_worker,
-                              worker_args, chunksize)
-    return max(breaks, key=lambda k: k[1])
-
-def monoalphabetic_break_hillclimbing_worker(message, alphabet,
-        max_iterations, fitness):
-    def swap(letters, i, j):
-        if i > j:
-            i, j = j, i
-        if i == j:
-            return letters
-        else:
-            return (letters[:i] + letters[j] + letters[i+1:j] + letters[i] +
-                    letters[j+1:])
-    best_alphabet = alphabet
-    best_fitness = float('-inf')
-    for i in range(max_iterations):
-        alphabet = swap(alphabet, random.randrange(26), random.randrange(26))
-        cipher_translation = ''.maketrans(string.ascii_lowercase, alphabet)
-        plaintext = message.translate(cipher_translation)
-        if fitness(plaintext) > best_fitness:
-            best_fitness = fitness(plaintext)
-            best_alphabet = alphabet
-            print(i, best_alphabet, best_fitness, plaintext)
-    return best_alphabet, best_fitness
-
 
 def vigenere_keyword_break_mp(message, wordlist=keywords, fitness=Pletters,
                               chunksize=500):