Skip to content

Commit 5b7730b

Browse files
nowakowskypoyea
authored andcommitted
Added Trafid Cipher (TheAlgorithms#746)
1 parent bb29dc5 commit 5b7730b

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed

ciphers/trafid_cipher.py

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
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: {}\nDecrypted: {}".format(encrypted, decrypted))

0 commit comments

Comments
 (0)