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