Coder, chiffrer, dissimuler l’information avec Python

💻 Travail n° 1 Chiffrement de César

🕮 Apport de connaissances :

Le chiffrement de César est une méthode simple de chiffrement qui consiste à décaler les lettres de l’alphabet d’un certain nombre de positions. Par exemple, avec un décalage de 3, ‘a’ devient ‘D’, ‘b’ devient ‘E’, etc…​

Lorsque le décalage "dépasse" la fin de l’alphabet, on revient au début.

cesar.drawio
  • Par convention, en cryptologie, le texte en clair est écrit en minuscules et le texte chiffré est écrit en MAJUSCULES.

  • Ce type de chiffrement est appelé chiffrement par substitution : chaque lettre est remplacée par une autre.
    Il diffère d’un chiffrement par transposition dans lequel on modifie l’ordre des lettres.

Avec ce chiffrement utilisant un décalage de 3 caractères, le mot “defi” devient “GHIL”.

🎯 Travail à faire :

  1. Déterminer mentalement le résultat du chiffrement des mots suivants avec l’algorithme de César utilisant un décalage — appelé aussi clé — de 3 lettres :

    • “demain”

    • “chiffrement”

    • “code secret” (supprimer l’espace pour le codage)

  2. Coder un script Python qui permet le chiffrement d’une seule lettre de l’alphabet fournie par l’utilisateur avec l’algorithme de César s’appuyant sur un décalage de 3 lettres.

    • Les codes ASCII des lettres minuscules de l’alphabet se succèdent (‘a’→0x61=97, ‘b’→0x62=98 …​ ‘z’→0x7a=122).
      C’est aussi le cas des lettres majuscules (‘A’→0x41=65, ‘B’→0x42=66 …​ ‘Z’→0x5A=90)

    • En Python, le code ASCII d’un caractère peut être obtenu avec la fonction ord()

      print(f"ASCII('a') : {ord('a')}")
      // affiche : ASCII('a') : 97

      Inversement, le caractère correspondant à un code ASCII peut être obtenu avec la fonction chr()

      print(f"CHR(97) : {chr(97)}")
      // affiche : CHR(97) : a
    • L’alphabet comportant 26 lettres, on pourra utiliser l’opérateur modulo (→ %) pour gérer le cas des lettres ‘x’, ‘y’, 'z' qui, une fois chiffrées, donnent 'A', 'B', 'C'

  3. Faire évoluer le code pour qu’il permette de chiffrer avec l’algorithme de César — toujours avec décalage de 3 lettres — un texte (c’est-à-dire plusieurs mots) saisi par l’utilisateur.

    Ce script devra :

    • supprimer les espaces du texte en clair avant de le chiffrer

    • convertir en minuscules le texte avant de le chiffrer

    • comporter une fonction chiffrer_cesar(texte_clair) qui retourne chiffré (en majuscules) le texte fourni en argument

    • afficher le texte en clair et sa correspondance chiffrée.

    • On peut supprimer les espaces d’une chaine de caractères avec la méthode replace()

      str = ' Python est un langage très facile '
      print(str.replace(" ", ""))
      // Affiche : Pythonestunlangagetrèsfacile

      🔥 Pour supprimer de la chaîne de caractères, tout ce qui n’est pas une lettre (espaces, chiffres, ponctuation, caractères spéciaux), on peut utiliser une liste en compréhension :

      str = " L'abonnement _Netflix_ est **vraiment** trop cher ! :-("
      alphaOnly = ''.join(c for c in str if c.isalpha() and c.isascii())
      print(alphaOnly)
      // Affiche : LabonnementNetflixestvraimenttropcher
    • Les méthodes lower() et upper() permettent respectivement de convertir en minuscules et en majuscules le texte auquel elles s’appliquent.

      str = "Hello WORLD" (1)
      print(f"majuscules -> {str.upper()}")
      print(f"minuscules -> {str.lower()}")
      // Affiche :
      // majuscules -> HELLO WORLD
      // minuscules -> hello world
      1 texte mélant minuscules et majuscules
  4. Faire évoluer le script pour que la fonction chiffrer_cesar() prenne un 2ème paramètre qui exprime le décalage désiré (valeur comprise entre 1 et 26).

💻 Travail n° 2 Déchiffrement de César - Force brute

🎯 Travail à faire :

  1. Faire évoluer le script du travail précédent pour qu’il propose une fonction qui permet cette fois-ci de déchiffrer un message chiffré avec l’algorithme de César.

  2. Modifier le script pour qu’il trouve seul, par force brute, le texte en clair et le décalage utilisé pour le cryptogramme suivant :

    VQHUQZEBAGDUZTGYQDOQEMDZAZBAGDXQXAGQDXQYMXCGQRAZFXQETAYYQEHUFMBDQEQGJXQNUQZQEFEAGHQZFQZFQDDQMHQOXQGDEAE

    La méthode consiste à décoder le message avec les 26 décalages possibles jusqu’à obtenir un message compréhensible.

    Ce texte fait partie de l’oraison funèbre de Marc Antoine lors des funérailles de César ⇒ le mot “cesar” doit sûrement apparaitre dans le texte en clair.

💻 Travail n° 3 Déchiffrement de César - Analyse de fréquence

🕮 Apport de connaissances :

L’analyse de fréquences est une méthode de cryptanalyse qui consiste à examiner la fréquence des lettres employées dans un message chiffré par une méthode de substitution qui remplace une lettre par une autre (comme dans le chiffrement de César).

Suite à cette analyse, on peut déduire la clé utilisée pour le chiffrement en comparant la fréquence des lettres du message chiffré avec celle qu’on peut retrouver dans un texte en clair dans une langue donnée.

En français, la fréquence de la lettre ‘e’ dans un texte en clair est la plus élevée comparée aux autres lettres: elle est d’environ 15% (elle peut varier selon le corpus utilisé).

Le message chiffré doit être d’une certaine taille pour obtenir des résultats satisfaisants avec cette méthode d’analyse de fréquence.

Dans le chiffrement de César, la lettre qui apparaitra le plus souvent dans le texte chiffré correspondra donc au 'e' dans le texte en clair. On pourra donc aisément en déduire la clé qui est simplement le décalage utilisé.

🎯 Travail à faire :

  1. On vous donne un texte chiffré avec l’algorithme de César :

    HFOJOWZZSNDFSBSNRSZODSWBSQSGHZSTCBRGEIWAOBEISZSACWBGIBFWQVSZOPCIFSIFGSBHOBHGOACFHDFCQVOWBSTWHJSBWFGSGSBTOBHGZSIFDOFZOGOBGHSACWBGUOFRSNJCIGZSIFRWHWZRSJSBRFSZVSFWHOUSEISBCIGCBHZOWGGSBCGDOFSBHGIBHFSGCFSGHQOQVSRSROBGXSBSGOWGDOGZSBRFCWHAOWGIBDSIRSQCIFOUSJCIGZSTSFOHFCIJSFJCIGSBJWSBRFSNOPCIHFSAISNJCHFSQVOADRSGEICBOIFOTOWHZOCIHQFSIGSNTCIWZZSNPSQVSNBSZOWGGSNBIZZSDZOQSCIZOAOWBBSDOGGSSHFSDOGGSZSDSFSACFHZSGTWZGJCIGFSHCIFBSBHZSQVOADRSQORSZODOFHCIHGWPWSBEIOIPCIHRSZOBWZSBFODDCFHOROJOBHOUSROFUSBHDCWBHRSQOQVSAOWGZSDSFSTIHGOUSRSZSIFACBHFSFOJOBHGOACFHEISZSHFOJOWZSGHIBHFSGCF
  2. Déterminer avec un script Python la lettre qui apparait le plus souvent dans ce texte et en déduire la clé utilisée pour le chiffrement

  3. Faire évoluer le script pour qu’il décode le message.

💻 Travail n° 4 Stéganographie : LSB or not LSB ?

🕮 Apport de connaissances :

La stéganographie est une technique utilisée pour dissimuler une information dans un message, une image, un objet d’apparence anodine.

Exemples :

  • Rédaction de messages avec du jus de citron qui deviendront invisibles lorsqu’ils sécheront et ne se révèleront qu’avec une source de chaleur.

  • Filigranes numériques intégrés à des images, musiques, vidéos pour prouver leur authenticité

  • Diffusion de malwares à travers d’images, documents .pdf, fichiers audio …​

La stéganographie diffère donc de la cryptographie dans la mesure où elle s’efforce de cacher l’existence même d’un message alors que la cryptographie cherche seulement à dissimuler son sens.

🎯 Travail à faire :

On vous fournit une image en niveaux de gris au format plain PGM : stegano.pgm img

On vous demande de trouver le FLAG (format FLAG{???????}) caché dans cette image.

  1. Se rendre sur PGM Format Specification link pour se renseigner sur le format PGM et plus particulièrement sur sa variante plain PGM

  2. Se rendre sur PGM/PPM Viewer link pour y téléverser l’image fournie pour la visualiser.

    LibreOffice Draw sait également ouvrir les fichiers PGM.

  3. Faire un script Python pour retrouver le flag sachant que :

    • Le flag est lui-même contenu dans une image plain PGM intégrée dans l’image d’origine.

    • Cette image est de même taille et contient autant de niveaux de gris que l’originale. Chaque point contiendra donc à la fois l’information du pixel de l’image d’origine et celle du pixel de l’image du FLAG.

    • L’image du FLAG est en noir et blanc et ne nécessite donc que de 2 valeurs pour coder les pixels

    • Les pixels de l’image du flag seront codés de façon à ce qu’ils ne soient pratiquement pas décelables dans l’image d’origine.

    • L’IA peut être utile si on sait rédiger le prompt adéquat.

    On peut s’appuyer sur ce document pdf pour comprendre davantage le principe de dissimulation d’un message dans une image au format PGM.

  4. Retourner sur PGM/PPM Viewer link (ou LibreOffice Draw) pour y téléverser l’image du FLAG de façon à retrouver sa valeur.

🞄  🞄  🞄