Skip to content

Commit

Permalink
Added Trafid Cipher (TheAlgorithms#746)
Browse files Browse the repository at this point in the history
  • Loading branch information
nowakowsky authored and poyea committed Apr 3, 2019
1 parent bb29dc5 commit 5b7730b
Showing 1 changed file with 86 additions and 0 deletions.
86 changes: 86 additions & 0 deletions ciphers/trafid_cipher.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
#https://en.wikipedia.org/wiki/Trifid_cipher

def __encryptPart(messagePart, character2Number):
one, two, three = "", "", ""
tmp = []

for character in messagePart:
tmp.append(character2Number[character])

for each in tmp:
one += each[0]
two += each[1]
three += each[2]

return one+two+three

def __decryptPart(messagePart, character2Number):
tmp, thisPart = "", ""
result = []

for character in messagePart:
thisPart += character2Number[character]

for digit in thisPart:
tmp += digit
if len(tmp) == len(messagePart):
result.append(tmp)
tmp = ""

return result[0], result[1], result[2]

def __prepare(message, alphabet):
#Validate message and alphabet, set to upper and remove spaces
alphabet = alphabet.replace(" ", "").upper()
message = message.replace(" ", "").upper()

#Check length and characters
if len(alphabet) != 27:
raise KeyError("Length of alphabet has to be 27.")
for each in message:
if each not in alphabet:
raise ValueError("Each message character has to be included in alphabet!")

#Generate dictionares
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")
character2Number = {}
number2Character = {}
for letter, number in zip(alphabet, numbers):
character2Number[letter] = number
number2Character[number] = letter

return message, alphabet, character2Number, number2Character

def encryptMessage(message, alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ.", period=5):
message, alphabet, character2Number, number2Character = __prepare(message, alphabet)
encrypted, encrypted_numeric = "", ""

for i in range(0, len(message)+1, period):
encrypted_numeric += __encryptPart(message[i:i+period], character2Number)

for i in range(0, len(encrypted_numeric), 3):
encrypted += number2Character[encrypted_numeric[i:i+3]]

return encrypted

def decryptMessage(message, alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ.", period=5):
message, alphabet, character2Number, number2Character = __prepare(message, alphabet)
decrypted_numeric = []
decrypted = ""

for i in range(0, len(message)+1, period):
a,b,c = __decryptPart(message[i:i+period], character2Number)

for j in range(0, len(a)):
decrypted_numeric.append(a[j]+b[j]+c[j])

for each in decrypted_numeric:
decrypted += number2Character[each]

return decrypted

if __name__ == '__main__':
msg = "DEFEND THE EAST WALL OF THE CASTLE."
encrypted = encryptMessage(msg,"EPSDUCVWYM.ZLKXNBTFGORIJHAQ")
decrypted = decryptMessage(encrypted, "EPSDUCVWYM.ZLKXNBTFGORIJHAQ")
print ("Encrypted: {}\nDecrypted: {}".format(encrypted, decrypted))

0 comments on commit 5b7730b

Please sign in to comment.