1+ #https://en.wikipedia.org/wiki/Trifid_cipher
2+
3+ def __encryptPart (messagePart , character2Number ):
4+ one , two , three = "" , "" , ""
5+ tmp = []
6+
7+ for character in messagePart :
8+ tmp .append (character2Number [character ])
9+
10+ for each in tmp :
11+ one += each [0 ]
12+ two += each [1 ]
13+ three += each [2 ]
14+
15+ return one + two + three
16+
17+ def __decryptPart (messagePart , character2Number ):
18+ tmp , thisPart = "" , ""
19+ result = []
20+
21+ for character in messagePart :
22+ thisPart += character2Number [character ]
23+
24+ for digit in thisPart :
25+ tmp += digit
26+ if len (tmp ) == len (messagePart ):
27+ result .append (tmp )
28+ tmp = ""
29+
30+ return result [0 ], result [1 ], result [2 ]
31+
32+ def __prepare (message , alphabet ):
33+ #Validate message and alphabet, set to upper and remove spaces
34+ alphabet = alphabet .replace (" " , "" ).upper ()
35+ message = message .replace (" " , "" ).upper ()
36+
37+ #Check length and characters
38+ if len (alphabet ) != 27 :
39+ raise KeyError ("Length of alphabet has to be 27." )
40+ for each in message :
41+ if each not in alphabet :
42+ raise ValueError ("Each message character has to be included in alphabet!" )
43+
44+ #Generate dictionares
45+ numbers = ("111" ,"112" ,"113" ,"121" ,"122" ,"123" ,"131" ,"132" ,"133" ,"211" ,"212" ,"213" ,"221" ,"222" ,"223" ,"231" ,"232" ,"233" ,"311" ,"312" ,"313" ,"321" ,"322" ,"323" ,"331" ,"332" ,"333" )
46+ character2Number = {}
47+ number2Character = {}
48+ for letter , number in zip (alphabet , numbers ):
49+ character2Number [letter ] = number
50+ number2Character [number ] = letter
51+
52+ return message , alphabet , character2Number , number2Character
53+
54+ def encryptMessage (message , alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ." , period = 5 ):
55+ message , alphabet , character2Number , number2Character = __prepare (message , alphabet )
56+ encrypted , encrypted_numeric = "" , ""
57+
58+ for i in range (0 , len (message )+ 1 , period ):
59+ encrypted_numeric += __encryptPart (message [i :i + period ], character2Number )
60+
61+ for i in range (0 , len (encrypted_numeric ), 3 ):
62+ encrypted += number2Character [encrypted_numeric [i :i + 3 ]]
63+
64+ return encrypted
65+
66+ def decryptMessage (message , alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ." , period = 5 ):
67+ message , alphabet , character2Number , number2Character = __prepare (message , alphabet )
68+ decrypted_numeric = []
69+ decrypted = ""
70+
71+ for i in range (0 , len (message )+ 1 , period ):
72+ a ,b ,c = __decryptPart (message [i :i + period ], character2Number )
73+
74+ for j in range (0 , len (a )):
75+ decrypted_numeric .append (a [j ]+ b [j ]+ c [j ])
76+
77+ for each in decrypted_numeric :
78+ decrypted += number2Character [each ]
79+
80+ return decrypted
81+
82+ if __name__ == '__main__' :
83+ msg = "DEFEND THE EAST WALL OF THE CASTLE."
84+ encrypted = encryptMessage (msg ,"EPSDUCVWYM.ZLKXNBTFGORIJHAQ" )
85+ decrypted = decryptMessage (encrypted , "EPSDUCVWYM.ZLKXNBTFGORIJHAQ" )
86+ print ("Encrypted: {}\n Decrypted: {}" .format (encrypted , decrypted ))
0 commit comments