Операция XOR симметрична c, поэтому все, что отличается между кодированием и декодированием, - это порядок, в котором выполняется операция ROT-13. Для кодирования вы делаете это до XOR, для декодирования вы делаете это потом.
import codecs
def xor_s(s, keystream):
for k in keystream:
s = "".join(chr(ord(c) ^ k) for c in s)
return s
def rot13(s):
return codecs.encode(s, "rot_13")
def enc(s, keystream):
return xor_s(rot13(s), keystream)
def dec(s, keystream):
return rot13(xor_s(s, keystream))
keystream = [
int(k, 16) for k in "A3 A7 AD B3 B5 BF C1 C5 C7 D3 DF E3 E5 E9 EF F1 FB".split(" ")
]
o = "Very Secret Message"
a = enc(o, keystream)
b = dec(a, keystream)
print(o, "->", a, "->", b)
распечатывает
Very Secret Message -> §°¹õ§¥°§²õ§³³»¡§ -> Very Secret Message