From: Neil Smith Date: Mon, 14 Jul 2014 19:00:03 +0000 (+0100) Subject: Implementing and solving vigenere and beaufort ciphers X-Git-Url: https://git.njae.me.uk/?a=commitdiff_plain;h=5fc159c3bddfcb5d623dacb88bd9be5309b536b8;p=cipher-training.git Implementing and solving vigenere and beaufort ciphers --- diff --git a/cipherbreak.py b/cipherbreak.py index 1adebe6..9ce8000 100644 --- a/cipherbreak.py +++ b/cipherbreak.py @@ -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):