Last active
October 26, 2015 23:47
-
-
Save telendt/4b200fba706679a839bf to your computer and use it in GitHub Desktop.
Crypto Puzzle
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ 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] |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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