I have been trying to implement various substitution ciphers in python. I implemented the Baconian cipher using a dictionary in which the plaintext letters are keys and the ciphertext letters are the corresponding values. Is there a way to make the following code shorter or more efficient or is there a better approach to implementing the cipher.
Python program to implement Baconian cipher
'''This script uses a dictionary instead of 'chr()' & 'ord()' function''' ''' Dictionary to map plaintext with ciphertext (key:value) => (plaintext:ciphertext) This script uses the 26 letter baconian cipher in which I,J & U,V have distinct patterns ''' lookup = {'A':'aaaaa', 'B':'aaaab', 'C':'aaaba', 'D':'aaabb','E':'aabaa', 'F':'aabab', 'G':'aabba', 'H':'aabbb', 'I':'abaaa', 'J':'abaab', 'K':'abaab', 'L':'ababa', 'M':'ababb', 'N':'abbaa', 'O':'abbab', 'P':'abbba', 'Q':'abbbb', 'R':'baaaa', 'S':'baaab', 'T':'baaba', 'U':'babaa', 'V':'babab', 'W':'babaa', 'X':'babab', 'Y':'babba' 'Z':'babbb'} #Function to encrypt the string according to the cipher provided def encrypt(message): cipher = '' for letter in message: #checks for space if(letter != ' '): #adds the ciphertext corresponding to the plaintext from the dictionary cipher += lookup[letter] else: #adds space cipher += ' ' return cipher #Function to decrypt the string according to the cipher provided def decrypt(message): decipher = '' i = 0 #emulating a do-while loop while True : #condition to run decryption till the last set of ciphertext if(i < len(message)-4): #extracting a set of ciphertext from the message substr = message[i:i+5] #checking for space as the first character of the substring if(substr[0] != ' '): ''' This statement gets us the key(plaintext) using the values(ciphertext) Just the reverse of what we were doing in encrypt function ''' decipher += list(lookup.keys())[list(lookup.values()).index(substr)] i += 5 #to get the next set of ciphertext else: #adds space decipher += ' ' i += 1 #index next to the space else: break #emulating a do-while loop return decipher def main(): message = "ALICE KILLED BOB" result = encrypt(message.upper()) print (result) message = "aaaaaababaabaaaaaabaaabaa abaababaaaababaababaaabaaaaabb aaaababbabaaaab" result = decrypt(message.lower()) print (result) #Executes the main function if __name__ == '__main__': main()
I have been implementing most of the substitution ciphers using dictionaries and I want to know is there a another approach to this as I am bored of using dictionaries.