mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-12-18 09:10:16 +00:00
86 lines
3.0 KiB
Python
86 lines
3.0 KiB
Python
|
#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))
|