mirror of https://github.com/dirtbags/moth.git
49 lines
1.3 KiB
Python
49 lines
1.3 KiB
Python
|
#!/usr/bin/python3
|
||
|
"""This is non-obvious, so let me elaborate. The message is translated to
|
||
|
binary with one character per binary bit. Lower case characters are 1's,
|
||
|
and upper case is 0. The letters are chosen at random. Tricky, eh?"""
|
||
|
|
||
|
import random
|
||
|
|
||
|
lower = b'abcdefghijklmnopqrstuvwxyz'
|
||
|
upper = lower.upper()
|
||
|
|
||
|
plaintext = [b'The next puzzle starts in the same way, but the last step is '
|
||
|
b'different.',
|
||
|
b'We wouldn\'t want them to get stuck so early, would we? '
|
||
|
b'Rat Fink']
|
||
|
|
||
|
def encode(text):
|
||
|
out = bytearray()
|
||
|
mask = 0x80
|
||
|
for t in text:
|
||
|
for i in range(8):
|
||
|
if t & mask:
|
||
|
out.append(random.choice(lower))
|
||
|
else:
|
||
|
out.append(random.choice(upper))
|
||
|
t = t << 1
|
||
|
|
||
|
return bytes(out)
|
||
|
|
||
|
def decode(text):
|
||
|
out = bytearray()
|
||
|
i = 0
|
||
|
while i < len(text):
|
||
|
c = 0
|
||
|
mask = 0x80
|
||
|
for j in range(8):
|
||
|
if text[i] in lower:
|
||
|
c = c + mask
|
||
|
mask = mask >> 1
|
||
|
i = i + 1
|
||
|
out.append(c)
|
||
|
return bytes(out)
|
||
|
|
||
|
c = encode(plaintext[0])
|
||
|
print('<dl><dt>Alice<dd>', str(c, 'utf-8'))
|
||
|
assert decode(c) == plaintext[0]
|
||
|
c = encode(plaintext[1])
|
||
|
print('<dt>Bob<dd>', str(c, 'utf-8'), '</dl>')
|
||
|
assert decode(c) == plaintext[1]
|