finished implementing encode and decode funcs

cat-town
Dan Buch 15 years ago
parent 91b711bea6
commit 5fbb4bfd72

@ -11,11 +11,23 @@ NULLCHAR = '.'
def encode(msg, pad): def encode(msg, pad):
return msg ret = []
filled = list(_text_padfill(msg, pad))
for i, line in enumerate(_text_cipherfill(filled)):
lineno = i + 1
if _is_cipherline(lineno):
ret.append(line)
return ''.join(ret).strip(NULLCHAR)
def decode(msg, pad): def decode(ciphertext, pad):
return msg ret = []
filled = list(_cipher_padfill(ciphertext, pad))
for i, line in enumerate(_cipher_textfill(filled)):
lineno = i + 1
if _is_textline(lineno):
ret.append(line)
return ''.join(ret).strip(NULLCHAR)
def create_pad(length, width=DEFAULT_PAD_WIDTH): def create_pad(length, width=DEFAULT_PAD_WIDTH):
@ -47,7 +59,7 @@ def _chunk_chars_into_lines(chars, width=DEFAULT_PAD_WIDTH):
def _as_line_chunks(chars, width=DEFAULT_PAD_WIDTH): def _as_line_chunks(chars, width=DEFAULT_PAD_WIDTH):
chunk = [] chunk = []
for char in chars: for char in chars.replace('\n', ''):
chunk.append(char) chunk.append(char)
if len(chunk) == width: if len(chunk) == width:
yield ''.join(chunk) yield ''.join(chunk)
@ -57,7 +69,9 @@ def _as_line_chunks(chars, width=DEFAULT_PAD_WIDTH):
yield ''.join(chunk) yield ''.join(chunk)
def _padfill(text, padlines): def _text_padfill(text, padlines):
if isinstance(padlines, basestring):
padlines = padlines.splitlines()
padlines = [line.strip() for line in padlines if line.strip()] padlines = [line.strip() for line in padlines if line.strip()]
textlines = _chunk_chars_into_lines(text, _get_textwidth(padlines)) textlines = _chunk_chars_into_lines(text, _get_textwidth(padlines))
for textline, padline in izip(textlines, padlines): for textline, padline in izip(textlines, padlines):
@ -66,17 +80,39 @@ def _padfill(text, padlines):
yield '' yield ''
def _cipherfill(padfilled_lines): def _cipher_padfill(ciphertext, padlines):
for i, line in enumerate(padfilled_lines): if isinstance(padlines, basestring):
padlines = padlines.splitlines()
padlines = [line.strip() for line in padlines if line.strip()]
cipherlines = _chunk_chars_into_lines(ciphertext, _get_textwidth(padlines))
for cipherline, padline in izip(cipherlines, padlines):
yield padline
yield ''
yield cipherline
def _text_cipherfill(padfilled_text_lines):
for i, line in enumerate(padfilled_text_lines):
lineno = i + 1 lineno = i + 1
if _is_cipherline(lineno): if _is_cipherline(lineno):
padline = padfilled_lines[i - abs(PADLINE_OFFSET)] padline = padfilled_text_lines[i - abs(PADLINE_OFFSET)]
textline = padfilled_lines[i - abs(TEXTLINE_OFFSET)] textline = padfilled_text_lines[i - abs(TEXTLINE_OFFSET)]
yield padline yield padline
yield textline yield textline
yield _cipherline_from_padline_and_textline(padline, textline) yield _cipherline_from_padline_and_textline(padline, textline)
def _cipher_textfill(padfilled_cipher_lines):
for i, line in enumerate(padfilled_cipher_lines):
lineno = i + 1
if _is_cipherline(lineno):
padline = padfilled_cipher_lines[i - abs(PADLINE_OFFSET)]
textline = padfilled_cipher_lines[i - abs(TEXTLINE_OFFSET)]
yield padline
yield _textline_from_cipherline_and_padline(line, padline)
yield line
def _cipherline_from_padline_and_textline(padline, textline): def _cipherline_from_padline_and_textline(padline, textline):
ret = [] ret = []
for padchar, textchar in izip(padline, textline): for padchar, textchar in izip(padline, textline):

@ -66,6 +66,14 @@ class TestOneTimePad(unittest.TestCase):
TEST_PADLINE) TEST_PADLINE)
self.assertEqual(TEST_TEXTLINE, actual) self.assertEqual(TEST_TEXTLINE, actual)
def test_encode_equals_expected(self):
ciphertext = OT.encode(TEST_MSG, TEST_PAD)
self.assertEqual(TEST_CIPHER, ciphertext)
def test_decode_equals_expected(self):
text = OT.decode(TEST_CIPHER, TEST_PAD)
self.assertEqual(TEST_MSG, text)
PADLINES = (1, 4, 7, 10, 13, 16, 19, 22, 25) PADLINES = (1, 4, 7, 10, 13, 16, 19, 22, 25)
TEXTLINES = (2, 5, 8, 11, 14, 17, 20, 23, 26) TEXTLINES = (2, 5, 8, 11, 14, 17, 20, 23, 26)
@ -75,5 +83,93 @@ TEST_PADLINE = 'HUCHUGGHOBUXADDHOHPGQBKXQKAOLRL'
TEST_TEXTLINE = 'THISCAKEISUNSATISFACTORYTOMEYES' TEST_TEXTLINE = 'THISCAKEISUNSATISFACTORYTOMEYES'
TEST_CIPHERLINE = 'BCMAXHRNXUPLTEXRGOQKKQBWKYNTKWD' TEST_CIPHERLINE = 'BCMAXHRNXUPLTEXRGOQKKQBWKYNTKWD'
TEST_MSG = \
'HOWMUCHCHUCKCOULDAWOODCHUCKCHUCKIFAWOODCHUCKCOULDCHUCKWOOD' \
'HOWMUCHCHUCKCOULDAWOODCHUCKCHUCKIFAWOODCHUCKCOULDCHUCKWOOD' \
'HOWMUCHCHUCKCOULDAWOODCHUCKCHUCKIFAWOODCHUCKCOULDCHUCKWOOD' \
'HOWMUCHCHUCKCOULDAWOODCHUCKCHUCKIFAWOODCHUCKCOULDCHUCKWOOD' \
'HOWMUCHCHUCKCOULDAWOODCHUCKCHUCKIFAWOODCHUCKCOULDCHUCKWOOD' \
'HOWMUCHCHUCKCOULDAWOODCHUCKCHUCKIFAWOODCHUCKCOULDCHUCKWOOD' \
'HOWMUCHCHUCKCOULDAWOODCHUCKCHUCKIFAWOODCHUCKCOULDCHUCKWOOD' \
'HOWMUCHCHUCKCOULDAWOODCHUCKCHUCKIFAWOODCHUCKCOULDCHUCKWOOD' \
'HOWMUCHCHUCKCOULDAWOODCHUCKCHUCKIFAWOODCHUCKCOULDCHUCKWOOD' \
'HOWMUCHCHUCKCOULDAWOODCHUCKCHUCKIFAWOODCHUCKCOULDCHUCKWOOD' \
'HOWMUCHCHUCKCOULDAWOODCHUCKCHUCKIFAWOODCHUCKCOULDCHUCKWOOD' \
'HOWMUCHCHUCKCOULDAWOODCHUCKCHUCKIFAWOODCHUCKCOULDCHUCKWOOD' \
'HOWMUCHCHUCKCOULDAWOODCHUCKCHUCKIFAWOODCHUCKCOULDCHUCKWOOD' \
'HOWMUCHCHUCKCOULDAWOODCHUCKCHUCKIFAWOODCHUCKCOULDCHUCKWOOD' \
'HOWMUCHCHUCKCOULDAWOODCHUCKCHUCKIFAWOODCHUCKCOULDCHUCKWOOD' \
'HOWMUCHCHUCKCOULDAWOODCHUCKCHUCKIFAWOODCHUCKCOULDCHUCKWOOD' \
'HOWMUCHCHUCKCOULDAWOODCHUCKCHUCKIFAWOODCHUCKCOULDCHUCKWOOD' \
'HOWMUCHCHUCKCOULDAWOODCHUCKCHUCKIFAWOO'
TEST_CIPHER = \
'FMHZRGHRITAMHVAOLBANWMNYPBYDCFCAVXAEEKXUTYXLUCYQVYPWZFSKYI' \
'LWKCHZSXLFCMZIEFHXKVUXVNBIQVSNYPTFVIZHSVTDCKWUSZHEHUPLZSUY' \
'BTPSMEISGTYDWCXVUCPGHHKXDOUHGCVDTDUQVKFDRDCHFIKTNFGDFODCQS' \
'RIWGZBLPTCSXLMPQODYLHQNGWNSCTHNDOZEUXWCEQAZMRGZIQUTUYSKOGW' \
'YGYPEDNUZDWBEPUHLWWBHLGADYTCNGEUFKPLQSAMMXCTXWQEOYBNKQAHBV' \
'PDKTMQSHDFCFBCVKXVTRSXRTBHAGKNLFASNVNENHHRNGCKXALMIBNZKOTL' \
'BZMWGSNMTLDNPXKVQZZUAZCSPWFNRKAMTNMCPHWGLGBVSNFDXSKVUFBZBW' \
'WICBUPCWZDUXCZTXHKQBMQNTBHAAGMBPKUIDTHITUEWEPPMACPXERXRYND' \
'RWQSBQQMSQRVWZMAQQKUGHLELKFLKHGNFFDHIWUZPDIMIOELSIHMUIZQCW' \
'KLPZQIFAXNDRRIIIHOYBGSCIYBIVSRTECEOZSBLYTNCXGQXEWMGIXHKBIL' \
'TOKWHGABPMXNAHEWFKIMOQPHVHSYZABWLMLSSDEHQIBNEMEMHCWOUBIIZS' \
'XPFWXMQNOTEANYGQBVMZAXNPAMWSUOGFAFFYUTKDZYHFTPYGOMDHESKOZI' \
'IPDXAMSAQOTGAQKYPYWWUYGHSBVODAHDSKDVPMLWRCXQXGAXQZBFNKXFKU' \
'WUDRWNRKECIQIUEEMQNCAZDDDOQOEGUVFVCTKLTISNOQILEKUYXCYZNHHZ' \
'OFHCSLOPPQAFLHHDZANGTXNQSDZSAFLLSGWULVHIDERMTZZHTDHTZPHEFN' \
'ORDEIYOVTTAWVTOOXSLZBOPMRCCKSMHQOVFERCOVUMWXFSNEMFALNWGRQC' \
'NLWELLXNCHZGXQEUGEVNCWMHRNGUTBKTVEXGASBRCEBSFITOEFSNIBTLME' \
'MERMOFVBNTFCTTWEGAIGRZQBBFOKOPXNCWXFBK'
TEST_PAD = """\
XXLNWDZOAYXBEGFCGADYHHKQUYOAULZQMRZHQVTRLDUARODERVGBWVVVKECHNQNWKUCLZBWU
KUDWNGFTSEGFFSKSVEKZUMLTOSLIZZTFXODBZZMACDFUTESFRBAPYYVTTOCKQBSSTDGPILKE
YHSTKXTTGVBAIIZXCUPHICYICDGOBOIUZUEYCMLHPNHXUEKCBWTMKYBKHZLNKTETDXIHYBHF
WBOSEXMRLZVHNZSSQSBCKAERRITRBAZWGVZNTGDSIVIZEMBKWDOOBDWIDCZIUHVTKVTSGFDT
NRGPNGRNKEVLZVYOAYTUWCDTOLGEQDBSHVRMMYYQIEZWKWZVCPGIAGKPNZEGTLPKMPEILQAC
MIPKMYCFMVZKUTVKIPXBKGLFATSDCMYLPYLSTPBARVELNSOUFPZMUTRIRNZLYMDITNXMKLGE
QXYRYEAOHGETEQMKTUMARPYMPKONUKYZIHTFGNHIKVOLTLRPMPNFSDHWQGVHBNDCWZCLUHQW
GIFBFZKZOFZRRYCBOSBWSNVFXXPSAGOUOXDNBNSOZADYYSKWQUTYNCDNGVLSZNDBCTSIYOUX
NNUGLZNKNDSYGRUCXTKLBIMXZMMZAEHVRFYMBFKVDPAEHOYCBXKADZOTRRMULOPAIKCIHKFY
BQKKMEXUPLMTKGFIMPMTDVRZEBFEFARDEVQADVKIVNBHNZLEAAGLFIKXHTQWXBPNLXZHFUDZ
XYLLVFETIDCYAXGTIHUFUSFMMWTLKZARVQOFGEBKIGWHFFFFKTHPQOMVAVILFLWMRLWPBWVW
PFKSLFFWKYQVPHVPQTTVFRLQXHFMGVXVHTNSVZQSETKHXAPPSLHAIAVXWGDFVKOBQLEWPAZY
WELQRIFCGSOVFSLYXMSETCTROLNKMDWZSGKREFEPEHCOKSMRTNCDSTHCSQKMKCBYEWZSQHPK
UNWWUBKICDYYOSIZWKWRLGGIMYWKMDXOUKYHCUYCACKSFRWWXADQUZTCNYEYCSQEBTCZMSCV
NTGCDGFUUCTQWINV........................................................
"""
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

Loading…
Cancel
Save