forked from palash25/pyphers
-
Notifications
You must be signed in to change notification settings - Fork 0
/
baconianCipher.py
81 lines (65 loc) · 2.49 KB
/
baconianCipher.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# 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': 'ababa', 'L': 'ababb', 'M': 'abbaa', 'N': 'abbab', 'O': 'abbba',
'P': 'abbbb', 'Q': 'baaaa', 'R': 'baaab', 'S': 'baaba', 'T': 'baabb',
'U': 'babaa', 'V': 'babab', 'W': 'babba', 'X': 'babbb', 'Y': 'bbaaa',
'Z': 'bbaab'}
# 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 = 'aaaaaababbabaaaaaabaaabaa ababaabaaaababbababbaabaaaaabb aaaababbbaaaaab'
result = decrypt(message.lower())
print(result)
# Executes the main function
if __name__ == '__main__':
main()