86 lines
2.0 KiB
Python
86 lines
2.0 KiB
Python
|
#!/usr/bin/env nix-shell
|
||
|
#!nix-shell -i python -p python3
|
||
|
|
||
|
# NOTE: the colors are used to keep track of which letters have been
|
||
|
# already substituted, and which are still unknown.
|
||
|
|
||
|
def green(s):
|
||
|
return f"\033[42m{s}\033[0m"
|
||
|
|
||
|
def red(s):
|
||
|
return f"\033[41m{s}\033[0m"
|
||
|
|
||
|
def substitute(cipher_text, substitution_map):
|
||
|
for letter in cipher_text:
|
||
|
if letter in substitution_map:
|
||
|
print(green(substitution_map[letter]), end="")
|
||
|
else:
|
||
|
print(red(letter), end="")
|
||
|
|
||
|
with open('ciphertext', 'r') as file:
|
||
|
enc = file.read()
|
||
|
|
||
|
# Here, I will be slowly substituting the letters in the ciphertext
|
||
|
# based on what I believe the words to be. I have commented out the
|
||
|
# invocations of substitute, and commented the newly found letters
|
||
|
# after each invocation.
|
||
|
|
||
|
# Starting off, "csds bh reod kzim" looks like "here is your flag"
|
||
|
|
||
|
substitution_map = {
|
||
|
'-': '-',
|
||
|
'_': '_',
|
||
|
'\n': '\n',
|
||
|
' ': ' ',
|
||
|
',': ',',
|
||
|
'.': '.',
|
||
|
';': ';',
|
||
|
'c': 'h',
|
||
|
's': 'e',
|
||
|
'd': 'r',
|
||
|
'b': 'i',
|
||
|
'h': 's',
|
||
|
'r': 'y',
|
||
|
'e': 'o',
|
||
|
'o': 'u',
|
||
|
'k': 'f',
|
||
|
'z': 'l',
|
||
|
'i': 'a',
|
||
|
'm': 'g',
|
||
|
}
|
||
|
|
||
|
# substitute(enc, substitution_map)
|
||
|
|
||
|
# found: euro't'e, ligh'a', o'f'er, 'q'ri'a'ish
|
||
|
# suspect: euro p e, ligh t, o v er, b ri t ish
|
||
|
|
||
|
substitution_map['t'] = 'p'
|
||
|
substitution_map['a'] = 't'
|
||
|
substitution_map['f'] = 'v'
|
||
|
substitution_map['q'] = 'b'
|
||
|
|
||
|
# substitute(enc, substitution_map)
|
||
|
|
||
|
# found: visite'n', british 'y'useu'y', sear'p'h, havi'x'g
|
||
|
# suspect: visite d , british m useu m , sear c h, havi'n'g
|
||
|
|
||
|
substitution_map['n'] = 'd'
|
||
|
substitution_map['y'] = 'm'
|
||
|
substitution_map['p'] = 'c'
|
||
|
substitution_map['x'] = 'n'
|
||
|
|
||
|
# substitute(enc, substitution_map)
|
||
|
|
||
|
# found: fre'g'uency, 'l'no'w'n, 'j'ust, e'v'act
|
||
|
# suspect: fre q uency, k no w n, j ust, e'x'act
|
||
|
|
||
|
substitution_map['g'] = 'q'
|
||
|
substitution_map['l'] = 'k'
|
||
|
substitution_map['w'] = 'w'
|
||
|
substitution_map['j'] = 'j'
|
||
|
substitution_map['v'] = 'x'
|
||
|
|
||
|
substitute(enc, substitution_map)
|
||
|
|
||
|
# still not sure about 'u'? But flag is found
|