C15.2 : Chiffrement symétrique
Principe
Le chiffrement symétrique utilise la même clé pour chiffrer et déchiffrer les données.
La clé de chiffrement doit donc être connue de l'émetteur (pour chiffrer) et du récepteur (pour déchiffrer).
Limites du chiffrement symétrique
Le chiffrement symétrique nécessité d'échanger la clé.
Les chiffrement symétrique ne garanti pas l'authenticité du message.
Applications
Chiffrement de César
Le chiffrement de César nécessite :
- - un alphabet : un ensemble ordonné de caractères ;
- - une clé de chiffrement : un nombre entier positif que l'on notera \(N\).
Le chiffrement consiste à prendre chaque caractère du message clair et à le remplacer par le caractère obtenu en effectuant une permutation circulaire de longueur \(N\) dans l'alphabet choisi.
A - Chiffrement et déchiffrement
On utilisera une variable globale pour définir l'alphabet utilisé.
Par exemple :
ALPHABET = """ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyzàéèêôç' .,!:"""
1) Écrire une fonction chiffre_cesar(message_clair:str, cle:int)->str qui renvoie le message chiffré par la méthode de César.
2) Expliquer comment la fonction précédente peut être, avec quelques adaptations éventuelles, utilisée pour déchiffrer un message chiffré. Procéder à ces adaptations si nécessaire.
B - Décryptage
1) Décryptage par force brute
1.a) Indiquer le nombre de clés possibles.
1.b) Cela vous semble-t-il accessible à un décryptage par force brute ?
2) Décryptage par l'analyse fréquentielle des lettre
Si l'alphabet utilisé est connu, la principale faille du chiffrement de César vient de la fréquence d'utilisation des lettres. en effet, en français, la lettre la plus utilisée est le E, puis le A, le I, le S...
2.a) Écrire une fonction frequence(texte:str)->dico qui renvoie un dictionnaire dont les clés sont les caractères utilisés dans texte, et les valeurs associées sont le nombre de fois que le caractère est utilisé.
2.b) Décrypter le poème suivant dont il faudra deviner le titre (l'auteur est Monique Mérabet) :
:t'i
qchm'cdr'L
sgàl
shptdr.Ztm'sqh
mfkd'
rohq
hs'z'kçhmehmh ZRdr'bêsàr'sqno'hrnlàsqhptdrZdmsq
u
hdms'rdr'qèudr'hm
rrntuhrZds'kç
f
ô
hdms'cd'kdtq'ltrhptd'!Zsnm'oàqhlésqd.'hk'drs'ehmh 'ehmh ZZTm'intq.'tm'
mfd'atbnkhptdZkth'fqdee
.'ahdm'
t'bdmsqd'cdr'bêsàrZcdtw'shdqr'cd'rdfldmsr'dm'nakhptd ZBds'
mfd'às
hs'dwbdkkdms'i
qchmhdqZds'ahdmsês.'rtqfdnmr'hcdmshptdr.Zsqnhr'aàaàr'sqhfnmdr'antqfdnmm
hdms ZZUnx
ms'ptç
hmrh'kd'oàqhlésqdZrç
fq
mchrr
hs'dm'adkkd'oqnonqshnm.Zhk'rthuhs'rnm'
qs'cd'fànlésqd.Zr
ts
ms'cd'chuhrhnm'dm'chuhrhnm ZBdk
'ehs'tmd'adkkd'àsnhkdZds'sntr'kdr'sqh
mfkdr'z'kçtmhrrnm.Zrd'edrsnmméqdms'cd'eq
bs
kdrZpth'qhu
k
hdms'dm'odqedbshnm
Chiffrement XOR
Ce chiffrement s'appuie sur l'utilisation de l'opérateur booléen XOR (symbole ⊕)
1) L'opérateur XOR
Table de vérité du XOR
L'opérateur XOR (aussi appelé opérateur "ou exclusif") est l'un des quatre opérateurs booléens de base (avec AND OR et NOT).
| a | b | a ⊕ b |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
Propriété mathématique du XOR
Formulation n° 1 : Si a ⊕ b = c alors a ⊕ c = b
Formulation n° 2 : (a ⊕ b) ⊕ b = a
Particularité du XOR
La fonction XOR est une fonction de base implémentée directement par l'unité arithmétique et logique du processeur, son exécution est donc rapide.
L'opérateur XOR en python
En python l'opérateur XOR est ^. Il s'applique sur des entiers
Exemples :
>>> 85 ^ 24
77
>>> bin(0b1001 ^ 0b1100)
'0b101'
2) Principe du chiffrement XOR
Le chiffrement XOR consiste à appliquer l'opérateur XOR bit après bit, entre le message clair et la clé (en la répétant si nécessaire) pour obtenir le message chiffré.
3) À faire
Dans ce travail, on souhaite chiffrer un texte par la méthode XOR avec une clé qui est également une chaine de caractères.
Chaque caractère (du message clair et de la clé) sera remplacé l'entier correspondant à son point de code unicode avant l'utilisation de l'opérateur XOR. On utilisera les fonctions ord et chr pour disposer du point de code unicode de chaque caractère et inversement.
Écrire une fonction chiffre_xor(message_clair:str, cle: str)->str qui chiffre une chaine de caractères avec une clé.