Le chiffrement de César est un chiffrement par décalage. Utilisé par Jules César, c’est une méthode de chiffrement simple qui consiste à décaler les lettres de rang vers la droite dans l’alphabet.
Dans cet exercice, on considère que l’alphabet se compose des lettres minuscules et du symbole espace.
alphabet = 'abcdefghijklmnopqrstuvwxyz '
Question 1 - À l'aide du carré de César, chiffrer le message « Bienvenue en nsi » avec la clef 9.
Question 2 - À l'aide du carré de César, déchiffrer le message « Bu setu suiqh uij fuk vyqrbu » avec la clef 16.
Question 3 - Écrire une fonction cesar_chiffrement
. Cette fonction prend en paramètre un message clair et une clé et retourne le message chiffré selon la méthode de César. La clé est un nombre compris entre 1 et 26.
def cesar_chiffrement(message_clair, cle):
'''
:param message_clair: (str) Message clair
:param cle: (int) Clé de chiffrement
'''
Question 4 - Écrire une fonction cesar_dechiffrement
. Cette fonction prend en paramètre un message chiffré et une clé et retourne le message déchiffré selon la méthode de César. La clé est un nombre compris entre 1 et 26.
def cesar_dechiffrement(message_chiffre, cle):
'''
:param message_chiffre: (str) Message chiffré
:param cle: (int) Clé de déchiffrement
'''
Question 5 - Écrire une fonction cesar_attaque_1
. Cette fonction permet de tester tous les décalages possibles afin de retrouver le message clair. Elle affiche toutes les possibilités du message clair ainsi que le décalage effectué.
def cesar_attaque_1(message_chiffre):
'''
:param message_chiffre: (str) Message chiffre
'''
Question 6 - Essayer la méthode cesar_attaque_1
avec le message suivant :
>>> m = "wocrynojladcojpyamojyxjcobcojcydcobjvobjzybbslsvscob"
>>> cesar_attaque_1(m)
methode brute force on teste toutes les possibilites
L’attaque par analyse de fréquence fonctionne de la manière suivante :
Dans toutes les langues, chaque lettre possède une fréquence d’apparition dans un texte. En français, la lettre la plus présente est le E.
Il faut ensuite trouver la lettre la plus présente dans le mesage chiffré. C’est cette lettre qui, potentiellement, pourra être associer à la lettre E, car les fréquence d'apparaition sont identiques.
Pour terminer, il suffit de calculer le décalage entre la lettre E et la lettre la plus présente dans le message. À la fin, on peut déchiffrer le message avec le décalage obtenu.
Question 7 - Écrire une fonction nb_occurence_lettre
. Cette fonction compte le nombre de lettres identiques dans un message et le stocke dans un dictionnaire. On ne prendra pas en compte la ponctuation et les espaces.
>>> nb_occurence_lettre(message)
{'w': 1, 'o': 9, 'd': 7, 'r': 1,...}
Question 8 - Écrire une fonction cesar_attaque_2
. Cette méthode implémente l’attaque par analyse de fréquence.
def cesar_attaque_2(message_chiffre):
'''
:param message_chiffre: (str) Message chiffre
'''
Question 9 - Essayer votre fonction avec le message suivant :
>>> m="wodryno lbedo pybmo yx docdo dyedoc voc zyccslsvsdoc"
>>> cesar_attaque_2(m)
methode brute force on teste toutes les possibilites
Inspiré du chiffrement de César, le chiffrement de Vigenère utilise une clé plus évoluée. En effet, la clef est composée de plusieurs caractères. Il permet de chiffrer chaque caractère du message différemment.
Dans cet exercice, on considère que l’alphabet se compose des lettres minuscules.
Question 1 - À l'aide du carré de Vigenère, chiffrer le message « Bienvenue en nsi » avec la clef « nsi ».
Question 2 - À l'aide du carré de César, déchiffrer le message « scnps nydeoci pttmiw » avec la clef « hello ».
Question 2 - Écrire une fonction vigenere_chiffrement
. Cette fonction prend en paramètre un message clair et une clé et retourne le message chiffré. La clé est une chaîne de caractères.
def vigenere_chiffrement(message_clair, cle):
'''
:param message_clair: (str) Message clair
:param cle: (int) Clé de chiffrement
'''
Question 2 - Écrire une fonction vigenere_dechiffrement
. Cette fonction prend en paramètre un message chiffré et une clé et retourne le message déchiffré. La clé est une chaîne de caractères.
def vigenere_dechiffrement(message_chiffre, cle):
'''
:param message_chiffre: (str) Message chiffre
:param cle: (int) Clé de dechiffrement
'''
L’opérateur OU exclusif (XOR) peut être utilisé pour chiffrer de manière symétrique un message. En effet, l’opérateur XOR possède les propriétés suivantes :
a XOR b = c
c XOR b = a
a
→ Le message clair, c
→ Le message chiffré et b
→ La clé.En python, l’opérateur XOR
s’utilise avec le symbole ^ entre 2 nombres.
>>> 82 ^ 101
55
>>> 55 ^ 101
82
Question 1 - Écrire une fonction str_to_int
. Cette fonction prend en paramètre une chaine de caractères. Elle retourne une liste d'entiers où chaque entier correspond à l'indice de la lettre dans l'alphabet.
def str_to_int(message):
'''
:param message:(str) Texte
:return: (list) Liste d'entiers
'''
>>> str_to_int('bonjour')
[1, 14, 13, 9, 14, 20, 17]
Question 2 - Écrire une fonction int_to_str
. Cette fonction prend en paramètre une liste d'entiers où chaque entier correspond à l'indice de la lettre dans l'alphabet. Elle retourne une chaine de caractère. C'est la fonction inverse de la fonction précédente.
def int_to_str(liste_entier):
'''
:param liste_entier:(list) Liste d’entiers
:return: (str) Texte
'''
>>> int_to_str([1, 14, 13, 9, 14, 20, 17])
'bonjour'
Avec ces fonctions, il est maintenant possible d'écrire les fonctions de chiffrement et de déchiffrement.
Question 3 - Écrire une fonction chiffrement_XOR
. Cette fonction prend en paramètre un message clair sous la forme d'une chaine de caractères et une clé sous la forme d'un entier. Elle retourne le message chiffré sous la forme d'une liste d'entiers.
def chiffrement_XOR(message_clair, cle) -> list:
'''
:param message_clair: (str) Message clair
:param cle: (int) Clé de chiffrement
'''
Question 4 - Écrire une fonction dechiffrement_XOR
. Cette fonction prend en paramètre le message chiffré sous la forme d'une liste d'entiers et une clé sous la forme d'un entier. Elle retourne le message clair sous la forme d'une chaine de caractères.
def dechiffrement_XOR(message_chiffre, cle) -> str:
'''
:param message_chiffre : (list) Message chiffré
:param cle: (int) Clé de déchiffrement
'''
Sous les systèmes d'exploitation Linux, il existe des commandes capables de chiffrer et de déchiffrer selon un algorithme choisi.
Pour cela, on utilise la commande openssl
.
Question 1 - Créer un nouveau fichier nommé clair.txt
dans lequel vous ajoutez le texte Bienvenue en NSI
. Ce fichier sera notre fichier de base pour les différents algorithmes de chiffrement.
Question 2 - À l'aide de la commande oppenssl
et de la documentation, générer un fichier codage-base64.txt
. Ce fichier correspond au codage du fichier clair.txt
à l'aide de l'algorithme base64
.
Question 3 - À l'aide de la commande oppenssl
et de la documentation, générer un fichier decodage-base64.txt
. Ce fichier correspond au décodage du fichier codage-base64.txt
à l'aide de l'algorithme base64
.
L'algortihme
base64
n'est pas un algorithme de chiffrement, mais un algortihme de codage. Voilà pourquoi aucune clef de chiffrement n'est demandée.
Question 4 - À l'aide de la commande oppenssl
et de la documentation, générer un fichier chiffrement-aes.txt
. Ce fichier correspond au chiffrement du fichier clair.txt
à l'aide de l'algorithme AES
.
Question 5 - À l'aide de la commande oppenssl
et de la documentation, générer un fichier dechiffrement-aes.txt
. Ce fichier correspond au déchiffrement du fichier chiffrement-aes.txt
à l'aide de l'algorithme AES
.
Sur le même principe que les questions précédents, essayer de chiffrer et de déchiffrer le fichier clair.txt
à l'aide de l'algorithme Triple DES
.