Более путинским способом было бы использовать списки;
plaintext = 'THISISAPLAINTEXT'
key = 'SPAMEGGS'
count = int(len(plaintext)/len(key))+1
stretchedkey = [ord(c) for c in key*count]
# Encryption
plainnum = [ord(c) for c in plaintext]
ciphernum = [a+b-65 for a, b in zip(plainnum, stretchedkey)]
ciphertext = ''.join([chr(c) if c <= 90 else chr(c-26) for c in ciphernum])
# Decryption
ciphernum = [ord(c) for c in ciphertext]
decryptnum = [a-b+65 for a, b in zip(ciphernum, stretchedkey)]
decrypt = ''.join([chr(c) if c >= 65 else chr(c+26) for c in decryptnum])
Показаны шаги в IPython;
In [1]: plaintext = 'THISISAPLAINTEXT'
In [2]: key = 'SPAMEGGS'
In [3]: count = int(len(plaintext)/len(key))+1
In [4]: stretchedkey = [ord(c) for c in key*count]
In [5]: plainnum = [ord(c) for c in plaintext]
In [6]: plainnum
Out[6]: [84, 72, 73, 83, 73, 83, 65, 80, 76, 65, 73, 78, 84, 69, 88, 84]
In [7]: ciphernum = [a+b-65 for a, b in zip(plainnum, stretchedkey)]
In [8]: ciphernum
Out[8]: [102, 87, 73, 95, 77, 89, 71, 98, 94, 80, 73, 90, 88, 75, 94, 102]
In [9]: ciphertext = ''.join([chr(c) if c <= 90 else chr(c-26) for c in ciphernum])
In [10]: ciphertext
Out[10]: 'LWIEMYGHDPIZXKDL'
In [11]: ciphernum = [ord(c) for c in ciphertext]
In [12]: decryptnum = [a-b+65 for a, b in zip(ciphernum, stretchedkey)]
In [13]: decryptnum
Out[13]: [58, 72, 73, 57, 73, 83, 65, 54, 50, 65, 73, 78, 84, 69, 62, 58]
In [14]: decrypt = ''.join([chr(c) if c >= 65 else chr(c+26) for c in decryptnum])
In [15]: decrypt
Out[15]: 'THISISAPLAINTEXT'
Я редактировал свой вопрос и код, чтобы люди могли быстро увидеть, что они должны знать, вместо того, чтобы открыть Pastebin ссылку, скопируйте код на свой компьютер, запустите его и введите вход, который может быть или не воспроизвести проблему. Я также вырезал часть кода, который работал, чтобы читать было не так. Обратите внимание: вот как задать вопрос о StackOverflow. Представьте, насколько это проще для читателей. –