#!/usr/bin/env python3 def generator(g, x, p): return pow(g, x) % p # xor encryption is symmetric, apart # from the reversing part def dynamic_xor_decrypt(plaintext, text_key): cipher_text = "" key_length = len(text_key) for i, char in enumerate(plaintext): key_char = text_key[i % key_length] encrypted_char = chr(ord(char) ^ ord(key_char)) cipher_text += encrypted_char return ''.join(reversed(cipher_text)) def decrypt(cipher, key): plaintext = '' for char in cipher: plaintext += chr(char // (key * 311)) return plaintext cipher = [151146, 1158786, 1276344, 1360314, 1427490, 1377108, 1074816, 1074816, 386262, 705348, 0, 1393902, 352674, 83970, 1141992, 0, 369468, 1444284, 16794, 1041228, 403056, 453438, 100764, 100764, 285498, 100764, 436644, 856494, 537408, 822906, 436644, 117558, 201528, 285498] if __name__ == '__main__': p = 97 g = 31 a = 97 b = 22 u = generator(g, a, p) v = generator(g, b, p) key = generator(v, a, p) b_key = generator(u, b, p) assert key == b_key decrypted = decrypt(cipher, key) xor_decrypted = dynamic_xor_decrypt(decrypted, 'trudeau') print(xor_decrypted)