destA = {} destA['B'] = {'K':K_B, 'ks':k_AB, 'kd':k_BA, 'ns':n_A, 'nd':n_B } destB = {} destB['A'] = {'K':K_A, 'ks':k_BA, 'kd':k_AB, 'ns':n_B, 'nd':n_A } #******************FIN de l'AUTHENTIFICATION************************* #***************DEBUT de la TRANSMISSION de MESSAGES***************** if i == 2 : while True : msg = input('Message qu\'envoie A à B, C, D...') i_A += 1 print(i_A) print('chez A') msg_chiffre, cles, resumes = c.pret_a_envoyer(msg, destA, i_A) print(msg_chiffre) print('chez B ') message_dechiffre, resume_B = c.retrouver_message(msg_chiffre, cles['B'], destB['A']['kd'], i_A) print(message_dechiffre) print(str(resumes['B']) + " " + str(resume_B)) if (msg == message_dechiffre): if (resumes['B'] == resume_B): print('Transmission réussie') else : print('Erreur de hashage')
def run(self): while True: m = input("> ") if(m != ""): action=m[0] #On récupère le type de l'action à réaliser: if action=="?": #On effectue la 1ère étape du protocole d'authentification: destinataire=m[1:] #On récupère le destinataire try: n = Crypto.Random.random.getrandbits(128) #On génère un n aléatoire messageAB = n.to_bytes(16, byteorder='big') #on va le chiffrer avec la clé publique de B cipher = PKCS1_OAEP.new(self.public_keys[destinataire]) n2 = cipher.encrypt(messageAB) In2=byteToHex(n2) #On stocke dans le fichier temporaire le n choisit self.temp[destinataire]={} self.temp[destinataire]["n_perso"]=n content={} content["n2"]=In2 self.socket.envoyer_message('demande_auth_1', self.id_user, [destinataire], content) print("Demande d'authentification envoyée") except KeyError: print("Cette personne n'est pas connectée ...") elif action=="&": #acceptation de la demande d'authentification de qqn type_msg="accept" user_asking=m[1:] try: cipher = PKCS1_OAEP.new(self.private_key) message = cipher.decrypt(self.temp[user_asking]["n2"]) Dn_A = int.from_bytes(message, byteorder='big') #on génère n_B et on le chiffre n_B= Crypto.Random.random.getrandbits(128) #on va caster n_B en une suite de bits messageBA = n_B.to_bytes(16, byteorder='big') #on va le chiffrer avec la clé publique de A cette fois cipher = PKCS1_OAEP.new(self.public_keys[user_asking]) n2_B = cipher.encrypt(messageBA) In2_B=byteToHex(n2_B) #calcul du hash de (n_A;n_B) mais ici Dn_A #on va caster (Dn_A:n_B) en entiers h = SHA256.new() h.update("{0}:{1}".format(Dn_A, n_B).encode('ASCII')) l_B = h.hexdigest() #On stocke dans le fichier temporaire Dn_A et n_B self.temp[user_asking]["n_demandeur"]=Dn_A self.temp[user_asking]["n_perso"]=n_B content={} content["n2_2"]=In2_B content["l"]=l_B #On envoie à l'utilisateur demandant l'authentification B, nB' et lB (voir schéma authentification) self.socket.envoyer_message('demande_auth_2', self.id_user, [user_asking], content) print("J'accepte l'authentification de "+user_asking) except KeyError: print("Cette personne ne vous a pas envoyé une demande d'authentification ...") else: type_msg="message" #envoi d'un message à qqn m_parts=m.split(':') #On récupère les destinataires dest=m_parts[0] destinataires=dest.split(',') #On crée la liste des destinataires du message try: keys={} for user in destinataires: keys[user]={} keys[user]['ksd'] = self.keys_msg[user]['ksd'] keys[user]['kds'] = self.keys_msg[user]['kds'] #On récupère le contenu du message message=m_parts[1] #On chiffre le message self.incr_msg=self.incr_msg+1 msg_chiffre, cles, resumes = c.pret_a_envoyer(message, keys, self.incr_msg) #On met toutes les infos necessaires dans du json content={} content["message"]=byteToHex(msg_chiffre) #Le message chiffré content["incr"]=self.incr_msg for user in destinataires: content[user]={} content[user]["k"]=byteToHex(cles[user]) #La clé k encryptée avec la clé de communication content[user]["r"]=byteToHex(resumes[user]) #Le résumé r pour l'intégrité #On transpose notre dictionnaire au format json self.socket.envoyer_message('message', self.id_user, destinataires, content) except KeyError: print("Un des destinataires rentrés n'existe pas ! Vérifiez que vous vous êtes bien authentifié avec lui")