From 3fd1d83c9bc82741aa11feead6bf8cdbfa50d8d2 Mon Sep 17 00:00:00 2001 From: "bollet.c" <> Date: Thu, 23 May 2024 22:26:44 +0200 Subject: [PATCH] chiffrement RSA ; send/receive ; message 'Finished' --- Interface.py | 13 ++++++++++++- InterfaceClient.py | 42 +++++++++++++++++++++++++++++++++++++++++- InterfaceServeur.py | 42 ++++++++++++++++++------------------------ 3 files changed, 71 insertions(+), 26 deletions(-) diff --git a/Interface.py b/Interface.py index 8f380dc..e5656f3 100644 --- a/Interface.py +++ b/Interface.py @@ -24,6 +24,7 @@ class Interface(tk.Tk): def send(self): """Envoie le message chiffré.""" + print("self.entree.get() dans Interface.py : ", self.entree.get()) message = self.entree.get().encode("utf8") # à compléter pour chiffrer le message if self._cleSymetrique != None: @@ -37,7 +38,7 @@ class Interface(tk.Tk): # à compléter pour déchiffrer le message if self._cleSymetrique != None: message = chiffre_xor(message, self._cleSymetrique) - self.message.set(message_dechiffre.decode("utf8")) + self.message.set(message.decode("utf8")) def set_cleSymetrique(self, val): """Définit/met à jour la clé symétrique""" @@ -57,3 +58,13 @@ def chiffre_xor(message, cle): res += lettre return res +def puissance_mod_rapide(a, b, n): + """renvoie a**b mod n""" + if b == 1: + return a + elif b == 2: + return (a**2)%n + elif b % 2 == 0: + return puissance_mod_rapide((a**2)%n, b // 2, n) + else: + return (a * puissance_mod_rapide((a**2)%n, b // 2, n)) % n \ No newline at end of file diff --git a/InterfaceClient.py b/InterfaceClient.py index cf14ec0..367a80c 100644 --- a/InterfaceClient.py +++ b/InterfaceClient.py @@ -1,13 +1,53 @@ # -*- coding: utf-8 -*- import tkinter as tk -from Interface import Interface +from random import SystemRandom +from Interface import Interface, puissance_mod_rapide class InterfaceClient(Interface): def __init__(self): Interface.__init__(self, "client") # à compléter + self.sendHelloButton = tk.Button(self, text="Hello", command=self.hello) + self.sendHelloButton.pack() + self.keyExchangeButton = tk.Button(self, text="KeyExchange", command=self.keyExchange) + self.keyExchangeButton.pack() + + def hello(self): + """envoie en clair le message HELLO""" + self.entree.set("HELLO") + self.send() + + def keyExchange(self): + """attend la clé publique du serveur + choisit une clé symétrique aléatoire de 7 caractères + la transmet en la chiffrant avec la clé publique du serveur + attend le message Finished du serveur chiffré avec cette clé""" + self.receive() + clePubliqueServeur = int(self.message.get()) + # + cleSymetriqueClair = symKeyGen() + # + cleSymetriqueClair_bytes = int.from_bytes(cleSymetriqueClair, "big") + cleSymetrique_chifree = self.chiffre_RSA(cleSymetriqueClair_bytes, clePubliqueServeur) + self.entree.set(str(cleSymetrique_chifree)) + self.send() + # + self.set_cleSymetrique(cleSymetriqueClair) + self.receive() + if self.message.get() == "Finished": + print("Connection sécurisée établie ☺") + + def chiffre_RSA(self, msg, cle): + """chiffre un message avec une clé publique""" + #suppose qu'on sait que n = 870567544966633301 + return puissance_mod_rapide(msg, cle, 870567544966633301) + + +def symKeyGen(): + """renvoie une clé symétrique aléatoire de 7 caractères""" + return bytes([SystemRandom().randint(0, 255) for _ in range(7)]) It = InterfaceClient() diff --git a/InterfaceServeur.py b/InterfaceServeur.py index edb4f57..5b71e7e 100644 --- a/InterfaceServeur.py +++ b/InterfaceServeur.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import tkinter as tk -from Interface import Interface +from Interface import Interface, puissance_mod_rapide class InterfaceServeur(Interface): @@ -11,42 +11,36 @@ class InterfaceServeur(Interface): self.e = 42205 self.d = 769020235650503533 # à compléter - self.btn_hello = tk.Button("Serveur Hello", command=self.hello) - self.btn_finished = tk.Button("Finished", command=self.finish) + self.waitForHelloButton = tk.Button(self, text="Serveur Hello", command=self.hello) + self.waitForHelloButton.pack() + self.finishedButton = tk.Button(self, text="Finished", command=self.finish) + self.finishedButton.pack() def hello(self): """attend la réception du message HELLO depuis le client, puis envoie en clair sa clé publique""" - msg_recu = self.receive() - if msg_recu == "HELLO": - self.entree.set(self.n) + self.receive() + if self.message.get() == "HELLO": + self.entree.set(self.e) self.send() + else: + print("HELLO n'a pas été reçu.") def finish(self): """attend la réception de la clé symétrique, la déchiffre avec sa clé privée, la mémorise et envoie le message Finished chiffré avec cette clé""" - msg_recu = self.receive() - self.set_cleSymetrique(self.dechiffre_RSA(msg)) - self.send("Finished") + self.receive() + cleSym = int(self.message.get()) + cleSym_dechiffree = self.dechiffre_RSA(cleSym).to_bytes(7, "big") + self.set_cleSymetrique(cleSym_dechiffree) + self.entree.set("Finished") + self.send() def dechiffre_RSA(self, msg): """déchiffre un message avec sa clé privée""" - return self.puissance_mod_rapide(msg , self.d, self.n) - - def puissance_mod_rapide(self, a, b, n): - """renvoie a**b mod n""" - if b == 1: - return a - elif b == 2: - a2 = (a**2)%n - elif b % 2 == 0: - return self.puissance_mod_rapide(a2, b // 2, n) - else: - return (a * self.puissance_mod_rapide(a2, b // 2, n)) % n - - + return puissance_mod_rapide(msg, self.d, self.n) - + It = InterfaceServeur() It.mainloop()