filling in tests for creation of cipherlines from pad+text and text from cipher-pad
This commit is contained in:
parent
76437746a2
commit
91b711bea6
@ -7,6 +7,7 @@ TEXTLINE_OFFSET = -1
|
|||||||
DEFAULT_PAD_WIDTH = 72
|
DEFAULT_PAD_WIDTH = 72
|
||||||
CIPHER_FLOOR = 1
|
CIPHER_FLOOR = 1
|
||||||
CIPHER_CEIL = 25
|
CIPHER_CEIL = 25
|
||||||
|
NULLCHAR = '.'
|
||||||
|
|
||||||
|
|
||||||
def encode(msg, pad):
|
def encode(msg, pad):
|
||||||
@ -52,7 +53,7 @@ def _as_line_chunks(chars, width=DEFAULT_PAD_WIDTH):
|
|||||||
yield ''.join(chunk)
|
yield ''.join(chunk)
|
||||||
chunk = []
|
chunk = []
|
||||||
if len(chunk) < width:
|
if len(chunk) < width:
|
||||||
chunk += (['.'] * (width - len(chunk)))
|
chunk += ([NULLCHAR] * (width - len(chunk)))
|
||||||
yield ''.join(chunk)
|
yield ''.join(chunk)
|
||||||
|
|
||||||
|
|
||||||
@ -66,24 +67,38 @@ def _padfill(text, padlines):
|
|||||||
|
|
||||||
|
|
||||||
def _cipherfill(padfilled_lines):
|
def _cipherfill(padfilled_lines):
|
||||||
padline = textline = None
|
|
||||||
for i, line in enumerate(padfilled_lines):
|
for i, line in enumerate(padfilled_lines):
|
||||||
if _is_padline(i):
|
lineno = i + 1
|
||||||
padline = line
|
if _is_cipherline(lineno):
|
||||||
elif _is_textline(i):
|
padline = padfilled_lines[i - abs(PADLINE_OFFSET)]
|
||||||
textline = line
|
textline = padfilled_lines[i - abs(TEXTLINE_OFFSET)]
|
||||||
else:
|
yield padline
|
||||||
cipherline = \
|
yield textline
|
||||||
_get_cipherline_from_padline_and_textline(padline, textline)
|
yield _cipherline_from_padline_and_textline(padline, textline)
|
||||||
padfilled_lines[i] = cipherline
|
|
||||||
|
|
||||||
return padfilled_lines
|
|
||||||
|
|
||||||
|
|
||||||
def _get_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):
|
||||||
idx = (_AS_NUMS[padchar] + _AS_NUMS[textchar]) % CIPHER_CEIL
|
if textchar == NULLCHAR:
|
||||||
|
ret.append(NULLCHAR)
|
||||||
|
continue
|
||||||
|
charnum = _AS_NUMS[padchar] + _AS_NUMS[textchar]
|
||||||
|
idx = charnum if charnum <= CIPHER_CEIL else charnum % CIPHER_CEIL
|
||||||
|
ret.append(_AS_ALPHA[idx])
|
||||||
|
return ''.join(ret)
|
||||||
|
|
||||||
|
|
||||||
|
def _textline_from_cipherline_and_padline(cipherline, padline):
|
||||||
|
ret = []
|
||||||
|
for ciphercar, padchar in izip(cipherline, padline):
|
||||||
|
if ciphercar == NULLCHAR:
|
||||||
|
ret.append(NULLCHAR)
|
||||||
|
continue
|
||||||
|
charnum = _AS_NUMS[ciphercar] - _AS_NUMS[padchar]
|
||||||
|
idx = charnum if charnum <= CIPHER_CEIL else charnum % CIPHER_CEIL
|
||||||
|
if idx < 0:
|
||||||
|
idx = CIPHER_CEIL + idx
|
||||||
ret.append(_AS_ALPHA[idx])
|
ret.append(_AS_ALPHA[idx])
|
||||||
return ''.join(ret)
|
return ''.join(ret)
|
||||||
|
|
||||||
|
@ -56,11 +56,24 @@ class TestOneTimePad(unittest.TestCase):
|
|||||||
self.assertFalse(OT._is_cipherline(lineno),
|
self.assertFalse(OT._is_cipherline(lineno),
|
||||||
'line {0} is not cipherline'.format(lineno))
|
'line {0} is not cipherline'.format(lineno))
|
||||||
|
|
||||||
|
def test_make_cipherline_from_padline_and_textline(self):
|
||||||
|
actual = OT._cipherline_from_padline_and_textline(TEST_PADLINE,
|
||||||
|
TEST_TEXTLINE)
|
||||||
|
self.assertEqual(TEST_CIPHERLINE, actual)
|
||||||
|
|
||||||
|
def test_make_textline_from_cipherline_and_padline(self):
|
||||||
|
actual = OT._textline_from_cipherline_and_padline(TEST_CIPHERLINE,
|
||||||
|
TEST_PADLINE)
|
||||||
|
self.assertEqual(TEST_TEXTLINE, actual)
|
||||||
|
|
||||||
|
|
||||||
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)
|
||||||
CIPHERLINES = (3, 6, 9, 12, 15, 18, 21, 24, 27)
|
CIPHERLINES = (3, 6, 9, 12, 15, 18, 21, 24, 27)
|
||||||
|
|
||||||
|
TEST_PADLINE = 'HUCHUGGHOBUXADDHOHPGQBKXQKAOLRL'
|
||||||
|
TEST_TEXTLINE = 'THISCAKEISUNSATISFACTORYTOMEYES'
|
||||||
|
TEST_CIPHERLINE = 'BCMAXHRNXUPLTEXRGOQKKQBWKYNTKWD'
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user