X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=szyfrow%2Fbifid.py;h=967bff4838dbfc5772b132de6eacb043b7c8021a;hb=3350a462f460e81d96c587466f5b6a88cbba1f7e;hp=478b239ae4b1e520f8f9bfca40c210016c87ba17;hpb=a870050db6bc974b1bb0d132001750b6624fb43f;p=szyfrow.git diff --git a/szyfrow/bifid.py b/szyfrow/bifid.py index 478b239..967bff4 100644 --- a/szyfrow/bifid.py +++ b/szyfrow/bifid.py @@ -1,9 +1,7 @@ import multiprocessing -from support.utilities import * -from support.language_models import * -from cipher.keyword_cipher import KeywordWrapAlphabet, keyword_cipher_alphabet_of - -from logger import logger +from szyfrow.support.utilities import * +from szyfrow.support.language_models import * +from szyfrow.keyword_cipher import KeywordWrapAlphabet, keyword_cipher_alphabet_of def bifid_grid(keyword, wrap_alphabet, letter_mapping): """Create the grids for a Bifid cipher @@ -30,14 +28,24 @@ def bifid_encipher(message, keyword, wrap_alphabet=KeywordWrapAlphabet.from_a, >>> bifid_encipher("indiacurry", 'iguana', period=4, fillvalue='x') 'ibnhgaqltzml' """ + + if period: + if not fillvalue: + raise ValueError("fillvalue must be given if period is given") + else: + p_message = message + pad(len(message), period, fillvalue) + else: + p_message = message + translation, f_grid, r_grid = bifid_grid(keyword, wrap_alphabet, letter_mapping) - t_message = message.translate(translation) + t_message = p_message.translate(translation) pairs0 = [f_grid[l] for l in sanitise(t_message)] if period: - chunked_pairs = [pairs0[i:i+period] for i in range(0, len(pairs0), period)] - if len(chunked_pairs[-1]) < period and fillvalue: - chunked_pairs[-1] += [f_grid[fillvalue]] * (period - len(chunked_pairs[-1])) + # chunked_pairs = [pairs0[i:i+period] for i in range(0, len(pairs0), period)] + # if len(chunked_pairs[-1]) < period and fillvalue: + # chunked_pairs[-1] += [f_grid[fillvalue]] * (period - len(chunked_pairs[-1])) + chunked_pairs = chunks(pairs0, period, fillvalue=None) else: chunked_pairs = [pairs0] @@ -61,14 +69,23 @@ def bifid_decipher(message, keyword, wrap_alphabet=KeywordWrapAlphabet.from_a, >>> bifid_decipher("ibnhgaqltzml", 'iguana', period=4) 'indiacurryxx' """ + if period: + if not fillvalue: + raise ValueError("fillvalue must be given if period is given") + else: + p_message = message + pad(len(message), period, fillvalue) + else: + p_message = message + translation, f_grid, r_grid = bifid_grid(keyword, wrap_alphabet, letter_mapping) t_message = message.translate(translation) pairs0 = [f_grid[l] for l in sanitise(t_message)] if period: - chunked_pairs = [pairs0[i:i+period] for i in range(0, len(pairs0), period)] - if len(chunked_pairs[-1]) < period and fillvalue: - chunked_pairs[-1] += [f_grid[fillvalue]] * (period - len(chunked_pairs[-1])) + # chunked_pairs = [pairs0[i:i+period] for i in range(0, len(pairs0), period)] + # if len(chunked_pairs[-1]) < period and fillvalue: + # chunked_pairs[-1] += [f_grid[fillvalue]] * (period - len(chunked_pairs[-1])) + chunked_pairs = chunks(pairs0, period, fillvalue=None) else: chunked_pairs = [pairs0] @@ -82,7 +99,7 @@ def bifid_decipher(message, keyword, wrap_alphabet=KeywordWrapAlphabet.from_a, return cat(r_grid[p] for p in pairs1) -def bifid_break_mp(message, wordlist=keywords, fitness=Pletters, max_period=10, +def bifid_break(message, wordlist=keywords, fitness=Pletters, max_period=10, number_of_solutions=1, chunksize=500): """Breaks a keyword substitution cipher using a dictionary and frequency analysis @@ -112,11 +129,9 @@ def bifid_break_mp(message, wordlist=keywords, fitness=Pletters, max_period=10, return sorted(breaks, key=lambda k: k[1], reverse=True)[:number_of_solutions] def bifid_break_worker(message, keyword, wrap_alphabet, period, fitness): - plaintext = bifid_decipher(message, keyword, wrap_alphabet, period=period) + plaintext = bifid_decipher(message, keyword, wrap_alphabet, + period=period, fillvalue='e') fit = fitness(plaintext) - logger.debug('Keyword break attempt using key {0} (wrap={1}) gives fit of ' - '{2} and decrypt starting: {3}'.format(keyword, - wrap_alphabet, fit, sanitise(plaintext)[:50])) return (keyword, wrap_alphabet, period), fit if __name__ == "__main__":