# (solved) Crypto/pseudo-key > Keys are not always as they seem... Provided files: `pseudo-key-output.txt` and `pseudo-key.py` `pseudo-key-output.txt` ``` Ciphertext: z_jjaoo_rljlhr_gauf_twv_shaqzb_ljtyut Pseudo-key: iigesssaemk ``` `pseudo-key.py` ```python= #!/usr/bin/env python3 from string import ascii_lowercase chr_to_num = {c: i for i, c in enumerate(ascii_lowercase)} num_to_chr = {i: c for i, c in enumerate(ascii_lowercase)} def encrypt(ptxt, key): ptxt = ptxt.lower() key = ''.join(key[i % len(key)] for i in range(len(ptxt))).lower() ctxt = '' for i in range(len(ptxt)): if ptxt[i] == '_': ctxt += '_' continue x = chr_to_num[ptxt[i]] y = chr_to_num[key[i]] ctxt += num_to_chr[(x + y) % 26] return ctxt with open('flag.txt') as f, open('key.txt') as k: flag = f.read() key = k.read() ptxt = flag[5:-1] ctxt = encrypt(ptxt,key) pseudo_key = encrypt(key,key) print('Ciphertext:',ctxt) print('Pseudo-key:',pseudo_key) ``` When encrypting the alphabet with itself, it shows that the output keyspace is 13 characters only. Decrypting the key against itself for both possibilities shows: ``` eedcjjjacgf rrqpwwwnpts ``` Combining between the two, the password was probably `redpwwwnctf`. Now decrypting the provided `ctxt` with this key gives the correct flag: `i_guess_pseudo_keys_are_pseudo_secure`. Used Python code: ```python= #!/usr/bin/python3 from string import ascii_lowercase import math chr_to_num = {c: i for i, c in enumerate(ascii_lowercase)} num_to_chr = {i: c for i, c in enumerate(ascii_lowercase)} ctxt='z_jjaoo_rljlhr_gauf_twv_shaqzb_ljtyut' pseudo_key='iigesssaemk' keydict='acegikmoqsuwyacegikmoqsuwy' def encrypt(ptxt, key): ptxt = ptxt.lower() key = ''.join(key[i % len(key)] for i in range(len(ptxt))).lower() ctxt = '' for i in range(len(ptxt)): if ptxt[i] == '_': ctxt += '_' continue x = chr_to_num[ptxt[i]] y = chr_to_num[key[i]] ctxt += num_to_chr[(x + y) % 26] return ctxt def decrypt(ctxt, key): key = ''.join(key[i % len(key)] for i in range(len(ctxt))).lower() ptxt = '' for i in range(len(ctxt)): if ctxt[i] == '_': ptxt += '_' continue x = chr_to_num[ctxt[i]] y = chr_to_num[key[i]] ptxt += num_to_chr[(x - y) % 26] return ptxt # Decrypt key key="" key2="" for i in pseudo_key: key += num_to_chr[keydict.find(i)] key2 += num_to_chr[keydict.find(i)+13] key = 'redpwwwnctf' print(decrypt(ctxt,key)) ```