X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=cipherbreak.py;h=e3c1e5f18a9d1a1dc8fcdda43346bf39828741ee;hb=837af0a78bfaf51266a1e21fbfd2baa80857d5bb;hp=a2eecad9cb34f3bb596e2e38e22ed60c1ccca840;hpb=7c5fd4061335669401bb298b5cec519b1f9afbc8;p=cipher-tools.git diff --git a/cipherbreak.py b/cipherbreak.py index a2eecad..e3c1e5f 100644 --- a/cipherbreak.py +++ b/cipherbreak.py @@ -40,6 +40,18 @@ from language_models import * # timeit.timeit('keyword_break(c5a)', setup='gc.enable() ; from __main__ import c5a ; from cipher import keyword_break', number=1) # timeit.repeat('keyword_break_mp(c5a, chunksize=500)', setup='gc.enable() ; from __main__ import c5a ; from cipher import keyword_break_mp', repeat=5, number=1) + +def index_of_coincidence(text): + stext = sanitise(text) + counts = collections.Counter(stext) + denom = len(stext) * (len(text) - 1) / 26 + return ( + sum(max(counts[l] * counts[l] - 1, 0) for l in string.ascii_lowercase) + / + denom + ) + + transpositions = collections.defaultdict(list) for word in keywords: transpositions[transpositions_of(word)] += [word] @@ -301,7 +313,7 @@ def vigenere_frequency_break(message, max_key_length=20, fitness=Pletters): """ def worker(message, key_length, fitness): splits = every_nth(sanitised_message, key_length) - key = cat([chr(caesar_break(s)[0] + ord('a')) for s in splits]) + key = cat([unpos(caesar_break(s)[0]) for s in splits]) plaintext = vigenere_decipher(message, key) fit = fitness(plaintext) return key, fit @@ -376,8 +388,7 @@ def beaufort_variant_frequency_break(message, max_key_length=20, fitness=Pletter """ def worker(message, key_length, fitness): splits = every_nth(sanitised_message, key_length) - key = cat([chr(-caesar_break(s)[0] % 26 + ord('a')) - for s in splits]) + key = cat([unpos(-caesar_break(s)[0]) for s in splits]) plaintext = beaufort_variant_decipher(message, key) fit = fitness(plaintext) return key, fit