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.