Skip to content

Instantly share code, notes, and snippets.

@telendt
Last active October 26, 2015 23:47
Show Gist options
  • Save telendt/4b200fba706679a839bf to your computer and use it in GitHub Desktop.
Save telendt/4b200fba706679a839bf to your computer and use it in GitHub Desktop.
Crypto Puzzle
$ python3 solution.py
AMAZON ECHO IS DESIGNED AROUND YOUR
VOICE. IT'S ALWAYS ON - JUST ASK FOR
INFORMATION, MUSIC, NEWS, WEATHER, AND
MORE. ECHO BEGINS WORKING AS SOON AS IT
DETECTS THE WAKE WORD. YOU CAN PICK
ALEXA OR AMAZON AS YOUR WAKE WORD. ECHO
IS ALSO AN EXPERTLY TUNED SPEAKER THAT
CAN FILL ANY ROOM WITH IMMERSIVE SOUND.
PLEASE VISIT WWW.AMAZON.COM/ECHO IF YOU
WANT TO FIND OUT MORE.
[email protected]
#!/usr/bin/env python
import hashlib
import itertools
import re
import string
PWORD_RE = re.compile(r'\w*P\w*')
def get_tabula_recta(*swaps):
d = dict(itertools.chain.from_iterable(
([(s[0], s[1]), (s[1], s[0])] for s in swaps)))
l = [d.get(l, l) for l in string.ascii_uppercase]
return {c: dict(zip(l, l[i:] + l[:i])) for i, c in enumerate(l)}
def letters_only(text):
return ''.join(c for c in text if c.isalpha())
def find_key(text, substr, known_str, tabula_recta, key_len=5):
s = letters_only(substr)
k = letters_only(known_str)
assert len(s) == len(k) > key_len
t = {k: dict((v1, k1) for k1, v1 in v.items())
for k, v in tabula_recta.items()}
key = [t[s[i]][k[i]] for i in range(key_len)]
i = key_len - letters_only(text).index(s) % key_len
if i != key_len:
key = key[i:] + key[:i]
return ''.join(key)
def decode(text, key, tabula_recta):
keychar = itertools.cycle(key)
return ''.join(tabula_recta[c][next(keychar)] if c.isalpha() else c
for c in text)
if __name__ == '__main__':
text = """\
HUTFGU WWNG VY NTTVTQTH HJYART XYAP
WSGGI. VM'X SVDGIC GU - BECO HYD LGY
AQLGYUTXCPF, CATVE, QTAN, OOSOOWB, SRT
UYQI. LERU FLTGKT DSBZCUT TC TPSQ ST VM
NTOLEUC OOW SSQL OYQH. FSE GEU NGGQ
HDOWE PJ TIESSQ ST FSEQ AHLO MGYP. OGLP
AX SVNS TK IQNOQOGX UARLP XBIHLOQ OOGU
GEU QGRV HFI QGPU SOOO ACIIYYGPI NSEKH.
MDOSTL HGCCR OSM.EJGJUR.KSC/TXOS GL MPC
SSRR MY LCUP YAO JSBT."""
tabula_recta = get_tabula_recta('CM', 'GS', 'KT', 'PV', 'QX')
key = find_key(text, 'OSM.EJGJUR.KSC', 'WWW.AMAZON.COM', tabula_recta)
decoded_text = decode(text, key, tabula_recta)
print(decoded_text)
print()
print('{}@amazon.com'.format(
hashlib.md5(''.join(w for w in PWORD_RE.findall(
decoded_text)).encode()).hexdigest()))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment