#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Wed Feb 16 12:30:05 2022 @author: pjoulaud """ PREM_CARAC = ord('A') - 1 DER_CARAC = ord('Z') #PREM_CARAC = 32 #DER_CARAC = 126 #PREM_CARAC = 0x21 #DER_CARAC = 0x1f0df MODULO = DER_CARAC - PREM_CARAC def codage_cle_chiffrement(chaine_a_coder, cle): """ Fonction de codage par substitution polyalphabetique Arguments : - chaine_a_coder : Message à coder de type str - cle : clé de chiffrement de type str Retourne : - chaine_chiffree : Message codé de type str >>> codage_cle_chiffrement("JE TIENS ENFIN LA GAULE", "SCIENCE") 'CH CNSQX XQONB OF ZDDQS' """ chaine_chiffree = "" i = 0 for car in chaine_a_coder : if car != " ": ord_car = ord(car) - PREM_CARAC ord_cle = ord(cle[i%len(cle)]) - PREM_CARAC sum_ord = ord_car + ord_cle #print(f"car : {car} - ord_car : {ord_car} - ord_cle : {ord_cle} - sum_ord : {sum_ord} - ") if sum_ord <= MODULO : car2 = chr(PREM_CARAC + sum_ord) else : car2 = chr(PREM_CARAC + sum_ord%MODULO) i += 1 else : car2 = car chaine_chiffree += car2 return chaine_chiffree def car_to_num(c): return ord(c) - PREM_CARAC def num_to_car(n): if n <= MODULO : return chr(PREM_CARAC + n) else : return chr(PREM_CARAC + n%MODULO) def codage_cle_chiffrement2(chaine_a_coder, cle): """ Fonction de codage par substitution polyalphabetique - 2e version Passe par deux fonctions (car_to_num et num_to_car) pour convertir de caractères vers valeur numérique et vice-versa. Arguments : - chaine_a_coder : Message à coder de type str - cle : clé de chiffrement de type str Retourne : - chaine_chiffree : Message codé de type str >>> codage_cle_chiffrement2("JE TIENS ENFIN LA GAULE", "SCIENCE") 'CH CNSQX XQONB OF ZDDQS' """ chaine_chiffree = "" i = 0 for car in chaine_a_coder : if car != " ": ord_car = car_to_num(car) ord_cle = car_to_num(cle[i%len(cle)]) sum_ord = ord_car + ord_cle #print(f"car : {car} - ord_car : {ord_car} - ord_cle : {ord_cle} - sum_ord : {sum_ord} - ") car2 = num_to_car(sum_ord) i += 1 else : car2 = car chaine_chiffree += car2 return chaine_chiffree def decodage_cle_chiffrement(chaine_codee, cle): """ Fonction de décodage par substitution polyalphabetique Arguments : - chaine_codee : Message codé de type str - cle : clé de chiffrement de type str Retourne : - chaine_clair : Message décodé de type str >>> decodage_cle_chiffrement(codage_cle_chiffrement("JE TIENS ENFIN LA GAULE", "SCIENCE"), "SCIENCE") 'JE TIENS ENFIN LA GAULE' """ chaine_clair = "" i = 0 for car in chaine_codee : if car != " ": ord_car = ord(car) - PREM_CARAC ord_cle = ord(cle[i%len(cle)]) - PREM_CARAC sum_ord = ord_car - ord_cle + MODULO #print(f"car : {car} - ord_car : {ord_car} - ord_cle : {ord_cle} - sum_ord : {sum_ord} - ") if sum_ord <= MODULO : car2 = chr(PREM_CARAC + sum_ord) else : car2 = chr(PREM_CARAC + sum_ord%MODULO) i += 1 else : car2 = car chaine_clair += car2 return chaine_clair #CORPS DE PROGRAMME if __name__=='__main__': import doctest doctest.testmod()