Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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

Lines changed: 86 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /