Partie 1 : Chiffrements symétriques
Exercice 1: le chiffrement de césar
A savoir sur les chaines:
chr(i) : renvoie la chaîne représentant un caractère dont le code de caractère utf-8 est le nombre entier i.
Exemple, chr(97) renvoie le caractère 'a'.
ord(i) : renvoie le nombre entier représentant le code utf-8 du caractère i
Exemple, ord('a') renvoie le nombre 97 .
Les codes UTF-8 et ASCII sont identiques pour les caractères de la table ASCII : table ASCII
liste.index(e) : renvoie l’indice de l’élément e dans la liste liste.
Exemple:
liste=['a','b','c','d','e','f']
liste.index('e') renvoie 4 ( indice de 'e' dans la liste)
Compléter les parties en pointillés du code de la fonction cesar(n,plaintext) qui chiffre ou déchiffre le message en clair plaintext avec la clé n.
# liste des symboles en clair : lettres majuscules de l'alphabet ( création par compréhension)
symbol_table = [ chr(i) for i in range(..., ....)]
def cesar( n, plaintext):
# longueur de la table des symboles en clair
l = ....................
print(f"table des {l} symboles : {symbol_table}")
# message chiffré = chaine vide au commencement
ciphertext =............................
# Pour chaque symbole dans le message à chiffrer
for ..... in ......:
# Si le symbole est dans la table des symboles en clair
if ..... in ........:
# Ajouter au message chiffré le symbole chiffré avec la clé n
........................
else:
# Sinon ajouter au message chiffré le symbole en clair
ciphertext += ..............................
# Retourner le message chiffré
return ciphertext
Exercice 2: le chiffrement de Vinginere
On choisit une clé sous la forme d’un mot ou d’une phrase qui donne le décalage à appliquer qui devient alors variable.
Supposons que la clé soit ABC, les décalages successifs seront 0, 1, 2, 0, 1, 2, 0, … ( position de A,B,C dans l'alphabet)
Exemple:
Message chiffré : XTKGYITP
Pour chiffrer un message selon le chifrement de Vigenère, on peut utiliser une table de correspondance. On parle de Code de Vignère.
Par exemple : N décalé avec L ( clé 11) donne Y
2.1 Coder le message suivant selon le principe du chiffrement de Vigenère
- Clé : NSI
- Message en clair : BONJOUR LE MONDE
- Table des symboles : ABCDEFGHIJKLMNOPQRSTUVWXYZ
2.2 Décoder le message suivant selon le principe du chiffrement de Vigenère
- Clé : les caractères NSI
- Message chiffré : IADR DS AKQ
- Table des symboles : ABCDEFGHIJKLMNOPQRSTUVWXYZ
- Tout symbole qui n’est pas dans la table est conservé
2.3 Coder une fonction de chiffrement de Vigenère
A l’aide de la fonction cesar(n,plaintext), écrire la fonction encrypt_vigenere(key,plaintext) qui chiffre le message en clair plaintext en utilisant la clé key. La table des symboles est composée des lettres majuscules de l’alphabet et tout symbole qui n’appartient pas à la table est conservé.
Remarque: va se poser pour vous la différence de longueur entre key et plaintext; on va parcourir plaintext, le caractère à la position i dans plaintext devra être décalé de son homologue dans key, si la chaine de key est plus courte, cette position n'existe pas.
Exemple, clé= KEY et message en clair = PLAINTEXT, on appelle i l'indice ( la position) de chaque lettre dans le message en clair
indice i=0 lettre=P doit être décalée de K,
indice i=1 lettre L doit être décalée de E,
indice i=2 lettre A doit être décalée de Y,
indice i=3: lettre I doit être décalée de K (on retourne au début de KEY),
indice i=4 lettre N doit être décalée de E,...
On obtient ce rebouclage avec le calcul i modulo de la longueur de la clé : clé[i%len(clé)] donne K,E ou Y selon i
2.4 Coder une fonction de déchiffrement de Vigenère
A l’aide de la fonction cesar(n,plaintext), écrire une fonction decrypt_vigenere(key,ciphertext) qui déchiffre le message chiffré ciphertext en utilisant la clé key. La table des symboles est composée des lettres majuscules de l’alphabet et tout symbole qui n’appartient pas à la table est conservé.
Exercice 3: le chiffrement xor
Le chiffrement et le déchiffrement de messages à partir d’une même clé peut être fait en utilisant l'opération logique XOR.
3.1 Recopier et compléter la table de vérité d'une opération xor ( le symbole graphique ⊕ signifie opération xor)
Avec une console python vous pouvez déterminer le résultat de l'opération xor qui se code ^ en python, exemples:
3.2 A l’aide de la table ASCII, coder le message en clair "NSI" avec la clé 0011 1010
3.3 A l’aide de la table ASCII, décoder le message chiffré "01110100 01101001 01110011" avec la clé ":"
Codage de fonctions de chiffrement et déchiffrement XOR
3.4 Écrire la fonction encrypt_xor(key,plaintext) qui chiffre le message en clair plaintext en utilisant la clé key :
plaintext : chaîne de caractères à chiffrer
key : clé de chiffrement limitée à un seul caractère (8 bits)
Rappel:
chr(i) : renvoie la chaîne représentant un caractère dont le code de caractère utf-8 est le nombre entier i.
Exemple, chr(97) renvoie le caractère 'a'.
ord(i) : renvoie le nombre entier représentant le code utf-8 du caractère i
Exemple, ord('a') renvoie le nombre 97.
ci-dessous: le caractère "N" devient "t" après opération xor sur la clé ":" , vous pouvez voir l'utilisation de ord et de chr
3.4 Écrire la fonction decrypt_xor(key,cyphertext) qui déchiffre le message chiffré cyphertext en utilisant la clé key :
Créé avec HelpNDoc Personal Edition: Éditeur de documentation CHM facile