Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from tkinter import *
- def xorCrypt(eventSender):
- # Convertis le message et la clef en tableaux de caractères
- msg = list( inputEntry.get() )
- key = list( keyEntry.get() )
- # Répete le message ou la clef pour qu'ils correspondent à la taille du plus grand tel que len(msg) = len(key)
- msg, key = extrapolateLen(msg, key)
- # Crée un tableau contenant dans chaque case le numero du caractère du message dans la table Unicode
- msgCharOrds = []
- for c in msg:
- msgCharOrds.append(ord(c))
- # Même chose pour la clef
- keyCharOrds = []
- for c in key:
- keyCharOrds.append(ord(c))
- # Vérifie si le message est à déjà été encrypté
- encrypted = checkIfMessageEncrypted(msgCharOrds)
- outputStr = ""
- # Si non encrypté, encryptons le
- if not encrypted:
- # Prends un à un chaque numero de caractère depuis les tableaux msgCharOrds et keyCharOrds
- # Ex: msgCharOrds = [1,2,3,4] et keyCharOrds = [5,6,7,8]
- # à chaque boucle (msgC, keyC) = (1,5)
- # puis (msgC, keyC) = (2,6)
- # puis (msgC, keyC) = (3,7)
- # et enfin (msgC, keyC) = (4,8)
- for msgC, keyC in zip(msgCharOrds, keyCharOrds):
- xor = msgC ^ keyC # XOR le nombre msgC et keyC et le sauve dans la variable xor
- xor = xor + 1000 # Ajoute 1000 à la variable XOR
- charXor = chr(xor) # Trouve le caractère dans la table Unicode correspondant au nombre dans la variable xor
- outputStr = outputStr + charXor # Ajoute le caractère nouvellement obtenu à la chaîne de caractère finale qui sera affiché
- outputStr = outputStr[:len(msg)] # Raccourcis la chaîne de caractère final à la taille du message original au cas ou
- # Si le message est déjà encrypté, décryptons le ==> faire toute les opérations à l'envers
- else:
- for msgC, keyC in zip(msgCharOrds, keyCharOrds): # Même chose que lors de l'encryption
- msgC = msgC - 1000 # Enlève 1000 au nombre du caractère du message pour compensé l'ajout lors de l'encryption
- xor = msgC ^ keyC # XOR de nouveau le nombre du caractère du message encrypté avec le nombre du caractère de la clef
- charXor = chr(xor) # Transforme ce nombre obtenu en caractère
- outputStr = outputStr + charXor # Ajoute le caractère à la chaîne de sortie
- outputStr = outputStr[:len(msg)] # Raccourcis la chaîne de caractère final à la taille du message original au cas ou
- inputEntry.delete(0, END) # Efface le contenu du champs de text contenant le message de début
- inputEntry.insert(0, outputStr) # Écrit le message nouvellement encrypté/décrypté à la place
- def checkIfMessageEncrypted(msgCharOrds):
- # Test if message is already encrypted
- encrypted = False
- for msgC in msgCharOrds:
- if msgC > 1000:
- encrypted = True
- return encrypted
- def extrapolateLen(arrayA, arrayB):
- # Which chain is the smallest ?
- smallestArr = arrayA if len(arrayA) < len(arrayB) else arrayB
- minSize = min([len(arrayA), len(arrayB)]) # Lenght of the smallest chain
- maxSize = max([len(arrayA), len(arrayB)]) # Lenght of the largest chain
- # Duplicate the smallest chain's characters till both chains have the same lenght
- for i in range(maxSize):
- if i >= minSize:
- smallestArr.append(smallestArr[i-minSize])
- return arrayA, arrayB
- # Initialise l'instance Tkinter
- mainWin = Tk()
- winWidth = 800
- winHeight = 130
- # Définis les dimensions de la fenêtre et les appliques
- mainWin.geometry('{}x{}'.format(winWidth, winHeight))
- # Définis le titre de la fenêtre
- mainWin.title("XOR Crypt")
- # Crée une étiquette avec le text "Message :" et l'ajoute à la fenêtre
- l1 = Label(mainWin, text="Message: ")
- l1.pack()
- # Crée un champ de text qui conteiendra le message, de largeur égale à celle de la fenêtre et l'ajoute
- inputEntry = Entry(mainWin, width=winWidth)
- inputEntry.pack()
- # Insert dans le champ de text un message d'essaie
- inputEntry.insert(0, "The quick brown fox jumps over the lazy dog. The dog killed the fox by the power of thunder.")
- l2 = Label(mainWin, text="Clef: ")
- l2.pack()
- # Crée un champ de text qui contiendra la clef, de largeur égale à celle de la fenêtre et l'ajoute
- keyEntry = Entry(mainWin, width=winWidth)
- keyEntry.pack()
- # Insert dans le champ de text une clef d'essaie
- keyEntry.insert(0, "123456789")
- # Crée une étiquette avec les instructions, définis une petite police en italic et l'ajoute à la fenêtre
- l3 = Label(mainWin, text="Instructions: Appuyez sur la touche 'Entrer' pour encrypter/décrypter le message à l'aide de la clef",
- font=("Helvetica",10,"normal","italic"))
- l3.pack()
- # /!\ IMPORTANT /!\
- # Lie l'action d'appuyer sur la touche "Entrer" (Return en anglais) à la fonction d'encryption
- # Lorsque la touche est appuyé, la fonction est appelé.
- # bind = verbe "lier"
- mainWin.bind("<Return>", xorCrypt)
- # Lance la boucle d'execution dans le thread principal
- mainWin.mainloop()
- '''
- ### Test run
- # Clear msg
- msg = list("The quick brown fox jumps over the lazy dog. The dog killed the fox by the power of thunder.")
- # Crypted msg
- msg = list("этоϼЬЫцукϹиЩуЪрϿцобϺсЩрЮЬЀоЯпЩϼЩцкЀниавϼйсиϾЁэтоϼйсиЀкрцчййϾЫифϹмфдϽмжЀеспϻЬтЩквЁцмϻШхЫсффЫЄ")
- # Key
- key = list("123456789")
- '''
- # max index char ever: 1114112
Advertisement
Add Comment
Please, Sign In to add comment