#! /usr/bin/python3
# ===================================================================
# Encrypt/Decrypt messages using a shift cipher (a Caesar cipher)
# -------------------------------------------------------------------
# notice how much code is devoted to reading and verifying the
# user's input.
# ===================================================================
import sys
import random
import user_interface as ui
abc = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'X', 'Y', 'Z', '.', '?', '!', '(',
'1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
')']
# -------------------------------------------------------------------
# ---- turn a list into a string
# -------------------------------------------------------------------
def listToString(l):
return (''.join(l))
# -------------------------------------------------------------------
# ---- create an encrypt/decrypt dictionary
# -------------------------------------------------------------------
def createEncryptDecryptDictionary(shift,ed):
dct = {}
for i in range(len(abc)):
x = i + shift # list index + shift count
xx = x % len(abc) # make sure the shifted index does not
# exceed the length of the list
if ed == 'E':
dct[abc[i]] = abc[xx]
else:
dct[abc[xx]] = abc[i]
return dct
# -------------------------------------------------------------------
# ---- check if a key is in a dictionary
# -------------------------------------------------------------------
def checkKey(dict,key):
if key in dict.keys():
return True
return False
# ------------------------------------------------------------------
# ---- main
# ------------------------------------------------------------------
while(True):
# --------------------------------------------------------------
# ---- get the user's input
# --------------------------------------------------------------
ui.clear_screen()
# ---- ask the user for a shift count
while(True):
print()
s = ui.get_user_input('Enter a shift count: ')
if not s: # empty string?
print()
sys.exit()
tf,shift = ui.is_int(s) # user's input an integer?
if not tf:
print()
print('input was not an integer, try again')
continue
shift = shift % len(abc)
if shift == 0:
print()
print('shift count is 0, try again')
continue
break
# ---- ask the user decrypt or encrypt?
while(True):
print()
s = ui.get_user_input('Encrypt or Decrypt [e,d]: ')
if not s: # empty string?
print()
sys.exit()
if s[0] == 'E' or s[0] == 'e':
ed = 'E'
break
if s[0] == 'D' or s[0] == 'd':
ed = 'D'
break
print()
print(f'Illegal selection ({s}) entered - try again')
# ---- ask the user to enter a text string
while(True):
print()
txt = ui.get_user_input('Enter text string: ')
if not txt: # empty string?
print()
sys.exit()
break
# ---- display runtime
print()
print(f'shift count {shift}')
if ed == 'E':
print(f'encrypt text string')
else:
print(f'decrypt text string')
# ---------------------------------------------------------------
# encrypt/decrypt the text string
# ---------------------------------------------------------------
# ---- create an encrypt/decrypt dictionary
dct = createEncryptDecryptDictionary(shift,ed)
# ---- uppercase the text string and convert it to a list
# ---- so it can be modified
lst = list(txt.upper())
# ---- encrypt/decrypt the list's characters
# ---- test if a character is in the encrypt/decrypt
# ---- dictionary. if yes change it otherwise leave it alone
for i in range(len(lst)):
if checkKey(dct,lst[i]):
lst[i] = dct[lst[i]]
# ---- turn the list into a string
s = ''.join([str(x) for x in lst])
# ---- tell the world
if ed == 'E':
print(f'encrypted text is:\n{s}')
else:
print(f'decrypted text is:\n{s}')
ui.pause()