L’objectif de ce document est d’illustrer un exemple de chiffrement symétrique, basique mais très utilisé dans les débuts de l’informatique car son implémentation est très simple..
Principe de la méthode
Rechercher le codage binaire du mot mon papa. C’est le message à chiffrer.
Pour déterminer le codage binaire d’un caractère il faut :
Rechercher son code sous forme décimale ;
Déterminer l’écriture binaire du code décimal.
On choisit le mot bar comme clé de chiffrement. Rechercher le codage binaire de ce mot.
Réponse
01100010 01100001 01110010
Le chiffrement est effectué à l’aide d’une opération logique : on effectue un XOR bit à bit entre les bits du message à chiffrer et ceux de la clé.
Rappeler la table de vérité du XOR (OU exclusif).
La clé est plus courte que le message. La dupliquer autant de fois que nécessaire (si la taille du message n’est pas un multiple entier de celle de la clé, ne prendre que quelques bits de cette dernière, en commençant par la gauche).
Définir la fonction codage dont la spécification est
1
2
3
4
5
6
7
8
defcodage(a:int)->str:"""
Détermine l'écriture binaire de l'entier
a passé en argument et la retourne sous
forme d'une chaîne de 8 caractères 0 ou 1.
Hypothèse : les caractères sont codés sur un octet.
"""
defcodage(a:int)->str:"""
Détermine l'écriture binaire de l'entier
a passé en argument et la retourne sous
forme d'une chaîne de 8 caractères 0 ou 1.
Hypothèse : les caractères sont codés sur un octet.
"""inv_chaine_bin=""# Chaîne binaire inverséewhilea!=0:inv_chaine_bin+=str(a%2)a=a//2octet=8# Formation d'octetsiflen(inv_chaine_bin)<octet:inv_chaine_bin+="0"*(octet-len(inv_chaine_bin))chaine_bin=""# Inversion de la chaîneforiinrange(len(inv_chaine_bin)-1,-1,-1):chaine_bin+=inv_chaine_bin[i]returnchaine_bin
Définir la fonction codage_chaine dont la spécification est
1
2
3
4
5
6
7
8
9
10
11
defcodage_chaine(texte:str)->str:"""
Convertit la chaîne de caractères passée
en argument en une chaîne de caractères
formés de 0 et de 1.
Les 0 et 1 constitue le codage binaire
de chacun des caractères de la chaîne
initiale.
Hypothèse : les caractères sont codés sur un octet.
"""
La fonction codage_chaine utilise les fonctions codage et ord.
Réponse
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
defcodage_chaine(texte:str)->str:"""
Convertit la chaîne de caractères passée
en argument en une chaîne de caractères
formés de 0 et de 1.
Les 0 et 1 constitue le codage binaire
de chacun des caractères de la chaîne
initiale.
Hypothèse : les caractères sont codés sur un octet.
"""rep=""forcarintexte:valeur=ord(car)# Valeur décimalechaine_bin=codage(valeur)rep+=chaine_binreturnrep
Vérifier que la fonction codage_chaine retourne bien le même codage que celui établi à la question 1. dans la partie principale du programme.
Obtenir le code de la clé utilisée à la question 2.
Réponses aux deux questions précédentes
1
2
3
4
5
6
7
8
9
10
if__name__=="__main__":#texte_a_chiffrer = input("Texte à chiffrer : ")texte_a_chiffrer="papa"texte_code=codage_chaine(texte_a_chiffrer)print(f"Code du texte :\n{texte_code}")#cle = input("Clé de chiffrement : ")cle="bar"cle_code=codage_chaine(cle)print(f"Code de la clé :\n{cle_code}")
Définir la fonction ajustement_cle dont la spécification est
1
2
3
4
5
6
defajustement_cle(code_cle:str,longueur_chaine:int)->str:"""
Ajuste la longueur du code de la clé à celle du
code de la chaîne à chiffrer, de longueur
longueur_chaine.
"""
Réponse
1
2
3
4
5
6
7
8
9
10
11
12
13
14
defajustement_cle(code_cle:str,longueur_chaine:int)->str:"""
Ajuste la longueur du code de la clé à celle du
code de la chaîne à chiffrer, de longueur
longueur_chaine.
"""iflen(code_cle)>=longueur_chaine:rep=code_cle[:longueur_chaine]else:rapport=longueur_chaine//len(code_cle)rep=code_cle*rapportrep+=code_cle[:longueur_chaine-len(rep)]returnrep
Définir la fonction chiffrement dont la spécification est
1
2
3
4
5
6
defchiffrement(chaine:str,cle:str)->str:"""
Réalise la chiffrement de chaine à l'aide de
la clé.
Méthode : chaine xor cle
"""
La fonction chiffrement utilise la fonction ajustement_cle.
Remarque : l’opérateur, en Python, permettant de réaliser le xor est ^à la condition que les opérandes soient des entiers.
Réponse
1
2
3
4
5
6
7
8
9
10
11
12
13
defchiffrement(chaine:str,cle:str)->str:"""
Réalise la chiffrement de chaine à l'aide de
clé.
Méthode : chaine xor cle
"""cle=ajustement_cle(cle,len(chaine))code_texte_chiffre=""foriinrange(len(chaine)):valeur=int(chaine[i])^int(cle[i])code_texte_chiffre+=str(valeur)returncode_texte_chiffre
Définir la fonction decodage dont la spécification est
1
2
3
4
5
6
7
defdecodage(car_code:str)->str:"""
Décode le caractère dont le code est passé en
argument.
Hypothèse : les caractères sont codés sur un octet
"""
Réponse
1
2
3
4
5
6
7
8
9
10
11
12
13
14
defdecodage(car_code:str)->str:"""
Décode le caractère dont le code est passé en
argument.
Hypothèse : les caractères sont codés sur un octet
"""valeur_code=0octet=8foriinrange(len(car_code)):valeur_code+=int(car_code[i])*2**(octet-(i+1))returnchr(valeur_code)
Définir la fonction decodage_chaine dont la spécification est
1
2
3
4
5
6
7
defdecodage_chaine(chaine_code:str)->str:"""
Décode la chaine dont le code est passé
en argument.
Hypothèse : les caractères sont codés sur un octet
"""
Définir la fonction dechiffrement dont la spécification est
1
2
3
4
5
6
defdechiffrement(code_chaine_chiffree:str,cle:str)->str:"""
Réalise la déchiffrement de chaine (codée) à l'aide de
la clé.
Méthode : chaine xor cle
"""