From dca18ca02297fffcc952f4c8076aa71b26878d93 Mon Sep 17 00:00:00 2001 From: Dan Buch Date: Wed, 25 Nov 2009 20:22:41 -0500 Subject: [PATCH] implemented the creation of random one-time pads of specified length, defaulting to width of 72 --- onetimepad.py | 51 ++++++++++++++++++++++++++++++++++++++++++++++ test_onetimepad.py | 19 ++++++++--------- 2 files changed, 59 insertions(+), 11 deletions(-) diff --git a/onetimepad.py b/onetimepad.py index 90d81bf..ca626b9 100644 --- a/onetimepad.py +++ b/onetimepad.py @@ -1,3 +1,4 @@ +import random def encode(msg, pad): @@ -6,3 +7,53 @@ def encode(msg, pad): def decode(msg, pad): return msg + + +def create_pad(length, width=72): + chars = _create_chars_for_pad(length) + lines = _chunk_chars_into_lines(chars, width=width) + return lines + + +def _create_chars_for_pad(length): + chars = [] + for char in range(length): + chars.append(_AS_ALPHA[random.randint(1, 25)]) + return ''.join(chars) + + +def _chunk_chars_into_lines(chars, width=72): + lines = [] + for chunk in _as_line_chunks(chars, width=width): + lines.append(chunk) + return '\n\n\n'.join(lines) + + +def _as_line_chunks(chars, width=72): + chunk = [] + for char in chars: + chunk.append(char) + if len(chunk) == width: + yield ''.join(chunk) + chunk = [] + if len(chunk) < width: + chunk += (['.'] * (width - len(chunk))) + yield ''.join(chunk) + + +def _mk_as_alpha(): + as_alpha = dict() + a_chr = ord('A') + past_j = False + + for char in range(26): + letter = chr(a_chr + char) + if letter != 'J': + key = char + (1 if not past_j else 0) + as_alpha[key] = letter + else: + past_j = True + return as_alpha + + +_AS_ALPHA = _mk_as_alpha() diff --git a/test_onetimepad.py b/test_onetimepad.py index eccb25f..b068032 100644 --- a/test_onetimepad.py +++ b/test_onetimepad.py @@ -5,17 +5,14 @@ import onetimepad as OT class TestOneTimePad(unittest.TestCase): - pad = 'THISISMYONETIMEPADANDITISNOTESPECIALLYBIG' \ - 'BUTITISBIGENOUGHFORMYUSESIFYOUDONTMINDTHX' - def test_encode(self): - enc = OT.encode(IN_MSG, self.pad) - self.assertEqual(EXPECTED_ENCODED, enc) + def test_mk_as_alpha_excludes_j(self): + self.assertTrue('J' not in OT._AS_ALPHA.values()) - def test_decode(self): - dec = OT.decode(EXPECTED_ENCODED, self.pad) - self.assertEqual(IN_MSG, dec) + def test_mk_as_alpha_dict_has_25_members(self): + self.assertEqual(25, len(OT._AS_ALPHA.items())) - -IN_MSG = 'TWOBYFOURBOARDSONEHUNDREDCOUNTLENGTHEIGHTFEET' -EXPECTED_ENCODED = 'huteshusoahutseohusoaeutoaehusoat' + def test_creates_pad_of_desired_length(self): + for width in (72, 33, 99, 111): + pad = OT.create_pad(2000, width=width) + self.assertEqual(2000, len((''.join(pad.split())).strip('.')))