#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Wed Feb 3 12:41:14 2021 @author: pjoulaud """ BLOC_ASCII = 2 CLE_PRIV_P = 53 CLE_PRIV_Q = 97 CLE_PUB_E = 11 CLE_PUB_N = CLE_PRIV_P * CLE_PRIV_Q def car_to_fig(chaine : str) -> str: """ Transforme une chaine de caractères en une chaine de caractères correspondant à leurs numéros d' ordre. Attention ! Chaque numéro d' ordre est codé sur BLOC_ASCII chiffres Arguments : chaine, chaine à coder de type str Retourne : nombre, une chaine de caractères avec tous les numéros d' ordre >>> car_to_fig('A') '01' >>> car_to_fig('ABZ') '010226' """ nombre = "" liste = [] for i in chaine : ordre = str(ord(i)-ord('A')+1) while len(ordre)%BLOC_ASCII != 0: ordre = '0'+ordre liste.append(ordre) #print(liste) nombre = "".join(liste) return nombre def chiffrement(chaine, bloc=3, e=CLE_PUB_E, n=CLE_PUB_N): """ Transforme une chaine de caractères en une chaine de caractères correspondant à leurs numéros d' ordre codés. Chaque numéro est séparé par un espace Arguments : chaine, chaine à coder de type str Retourne : nombre, une chaine de caractères avec les numéros codés >>> chiffrement('A') '1689' >>> chiffrement('ABZ') '755 2705' """ chaine_num = car_to_fig(chaine) while len(chaine_num)%bloc != 0 : chaine_num = '0'+chaine_num print("code du message initial :\n",chaine_num) liste = [] for i in range(len(chaine_num)//bloc): morceau_chaine_num = chaine_num[i*bloc:(i+1)*bloc] morceau_chaine_num = int(morceau_chaine_num) morceau_chaine_num = morceau_chaine_num**e morceau_chaine_num = morceau_chaine_num%n liste.append(str(morceau_chaine_num)) code = " ".join(liste) print("code du message chiffre :\n", code) return code def dechiffrement(chaine_num, bloc=3, e=CLE_PUB_E, n=CLE_PUB_N, p=CLE_PRIV_P, q=CLE_PRIV_Q): """ Transforme une chaine de caractères correspondant à leurs numéros d' ordre codés en message décodé. Arguments : chaine_num, chaine de codes de type str Retourne : message, une chaine de caractères avec le message décodé >>> dechiffrement(chiffrement('A')) 'A' >>> dechiffrement(chiffrement('ABZ')) 'ABZ' """ nombre = 1 # PARTIE LA PLUS DIFFICILE # Il faut déterminer e tel que e.d = 1 mod [(p-1)(q-1)] # Mon astuce : On incrémente de (p-1)(q-1) jusqu' à obtenir un nombre # divisible par e while nombre%e != 0 : nombre += (p-1)*(q-1) d = nombre//e liste_num = chaine_num.split(' ') liste_decod = [] for i in liste_num : decode = (int(i)**d) % n decode = str(decode) while len(decode)%bloc != 0: decode = '0'+decode liste_decod.append(decode) chaine_decode = ''.join(liste_decod) message = "" while len(chaine_decode)%BLOC_ASCII != 0: chaine_decode = '0' + chaine_decode print("code du message dechiffre : \n",chaine_decode) for i in range(len(chaine_decode)//BLOC_ASCII, 0, -1): morceau_chaine_num = chaine_decode[(i-1)*BLOC_ASCII:i*BLOC_ASCII] morceau_chaine_num = int(morceau_chaine_num) if morceau_chaine_num != 0: message = chr(morceau_chaine_num+ord('A')-1) + message print("Message dechiffre :\n", message) return message if __name__=='__main__': if (CLE_PRIV_P-1)*(CLE_PRIV_Q-1)%CLE_PUB_E == 0: raise Exception("e n' est pas premier avec (p-1)(q-1)") chaine_depart = 'ABONJOURLESFRANCAISESETLESFRANCAIS' print("chaine de depart : ",chaine_depart) mon_code = chiffrement(chaine_depart, bloc=4) #print("code : ", mon_code) mon_message = dechiffrement(mon_code, bloc=4) print('message : ', mon_message)