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 :

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.

Afficher la correction
ALPHABET = """ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyzàéèêôç' .,!:"""

def cesar(message_clair:str, cle:int)->str:
    """
    Fonction qui permet de chiffrer et déchiffre avec la méthode César.
    """
    lg_alphabet = len(ALPHABET)
    message_chiffre = ""
    for lettre in message_clair:
        nb = ALPHABET.index(lettre)
        nb_chiffre = (nb + cle) % lg_alphabet
        lettre_chiffre = ALPHABET[nb_chiffre]
        message_chiffre = message_chiffre + lettre_chiffre
    return message_chiffre


# ===== Programme principal =====
m = "BONJOUR A TOUS."
c = 8
print(m)
m2 = cesar(m, c)
print(m2)
m3 = cesar(m2, -c)
print(m3)

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

Afficher la correction

L'alphabet est celui du A.

La clé est de chiffrement est égale à 1, donc pour déchiffrer il faut utiliser -1.

 

FRACTALES

Au jardin des Mathématiques,
un triangle aspirait à l'infini.
Ses côtés trop isométriques
entravaient ses rêves inassouvis
et l'agaçaient de leur musique :
ton périmètre, il est fini... fini.

Un jour, un ange bucolique
lui greffa, bien au centre des côtés
deux tiers de segments en oblique.
Cet ange était excellent jardinier
et bientôt, surgeons identiques,
trois bébés trigones bourgeonnaient.

Voyant qu'ainsi le périmètre
s'agrandissait en belle proportion,
il suivit son art de géomètre,
sautant de division en division.
Cela fit une belle étoile
et tous les triangles à l’unisson,
se festonnèrent de fractales
qui rivalaient en perfection.

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é.

Afficher la correction
def chiffre_xor(message_clair:str, cle:str)->str:
    """
    Fonction qui permet de chiffrer et déchiffre avec la méthode XOR.
    """
    message_chiffre = ""
    LG_CLE = len(cle)
    for i in range(len(message_clair)):
        nb_lettre = ord(message_clair[i])
        nb_cle = ord(cle[i % LG_CLE])
        nb_lettre_chiffre = nb_lettre ^ nb_cle
        lettre_chiffre = chr(nb_lettre_chiffre)
        message_chiffre = message_chiffre + lettre_chiffre
    return message_chiffre

    # ===== Programme principal =====
m = "BONJOUR A TOUS."
c = "al"
print(m)
m2 = chiffre_xor(m, c)
print(m2)
m3 = chiffre_xor(m2, c)
print(m3)

Complément