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
>>> 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]
>>> 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]
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
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__":