forked from TheAlgorithms/Python
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added Trafid Cipher (TheAlgorithms#746)
- Loading branch information
1 parent
bb29dc5
commit 5b7730b
Showing
1 changed file
with
86 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)) |