''' Caesar_Cipher1.py
Caesar Cipher encryption/decryption
using Python's double-ended queue rotation
tested with Python 3.4.1  by  vegaseat  13jan2015
'''

from collections import deque

def caesar_cipher(text, shift, decode=False):
    # avoid these shifts
    if shift == 32 or shift >= 95:
        shift = 13
    # change from encode to decode if decode=True
    if decode:
        shift = -shift
    # give alpha 94 ASCII characters
    alpha = "".join(chr(c) for c in range(32, 127))
    dq = deque(alpha)
    # shift/rotate the alphabet (dq in place)
    dq.rotate(shift)
    crypted = ""
    for c in text:
        if c in alpha:
            # get the letter's index in alpha and apply to dq
            index_alpha = alpha.index(c)
            crypted += dq[index_alpha]
        else:
            crypted += c
    return crypted


# testing ...
# shift key should be higher than 0 (try 1 to 94)
shift = 11

# test
print("shift = {}".format(shift))
text = "The quick brown fox jumped over the lazy dogs ..123!{}"
print("Original text:")
print(text)

encoded = caesar_cipher(text, shift)
print("Encoded text:")
print(encoded)

print("Decoded text:")
print(caesar_cipher(encoded, shift, decode=True))

''' result ...
shift = 11
Original text:
The quick brown fox jumped over the lazy dogs ..123!{}
Encoded text:
I]Ztfj^X`tWgdlct[dmt_jbeZYtdkZgti]ZtaVontYd\ht##&'(upr
Decoded text:
The quick brown fox jumped over the lazy dogs ..123!{}
'''

Modified code to avoid shift of 32 or shifts higher or equal to 95.
A shift of 32 changes a..z to A..Z.
A shift of 95 wraps around to the beginning of alpha.

Edited 1 Year Ago by vegaseat

The article starter has earned a lot of community kudos, and such articles offer a bounty for quality replies.