diff --git a/ciphers/trafid_cipher.py b/ciphers/trafid_cipher.py
new file mode 100644
index 000000000000..0453272f26a0
--- /dev/null
+++ b/ciphers/trafid_cipher.py
@@ -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))
\ No newline at end of file