115 lines
3.5 KiB
Python
Executable File
115 lines
3.5 KiB
Python
Executable File
#!/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() |