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