{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ca34006a",
   "metadata": {},
   "source": [
    " ## Méthodes de Chiffrement\n",
    "\n",
    "> But du projet : Montrer différentes façons de chiffrer un message\n",
    "\n",
    "La cryptographie est une discipline très ancienne. Elle est utilisée depuis l'antiquité et utilise différentes techniques.  \n",
    "Je vous engage à lire la page wikipédia  : https://fr.wikipedia.org/wiki/Histoire_de_la_cryptologie  qui récapitule des exemples historiques dont certains sont plutôt surprenants.  "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "345a9db8",
   "metadata": {},
   "source": [
    "# Cahier des charges\n",
    "\n",
    "Vous devez réaliser des fonctions permettant de mettre en oeuvre les différentes méthodes de chiffrement. Essayer de respecter ce qu'il est proposé de faire. \n",
    "\n",
    "### Dans vos programmes vous devez :  \n",
    "* **Expliquer chacune des fonctions créées** , c'est-à-dire écrire une documentation de la fonction (docstring). Cette documentation devra expliquer le principe de la transformation réalisée par votre code python.  \n",
    "* **Commenter certaines lignes** pour montrer les points importants de votre code. \n",
    "* Ecrire un jeu de test pertinent pour chacune d'elle.  \n",
    "* Utiliser des variables avec des noms explicites.\n",
    "\n",
    "### Rédaction d'un dossier d'accompagnement présentant  :  \n",
    "* la recherche documentaire nécessaire pour réaliser votre projet (sitographie / bibliographie )\n",
    "* le **partage des tâches réalisées** au sein de votre équipe.  \n",
    "* une **conclusion** sur les points d'améliorations possible de votre programme (correction de bug et extension). \n",
    "* ce que vous avez aimé ou pas aimé faire dans ce projet et en NSI de manière générale. "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c794e2a1",
   "metadata": {},
   "source": [
    "# Présentation du projet\n",
    "Ci-dessous, je vous présente les techniques de chiffrement qu'il faudra mettre en oeuvre:"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1634fe7e",
   "metadata": {},
   "source": [
    "### 1. Le chiffre de César\n",
    "Le chiffre de César est une façon simple de coder un message afin de conserver le secret du contenu jusqu’à son destinataire. Il s’agit tout simplement de décaler chaque lettre du message.  \n",
    "Voyons l’exemple d’un décalage de **trois lettres** : A devient D; B devient E; etc.  \n",
    "\n",
    "    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z lettres du message en clair\n",
    "    D E F G H I J K L M N O P Q R S T U V W X Y Z A B C lettres du message codé\n",
    "\n",
    "Par exemple le message :\n",
    "\n",
    "    CAPTUREZ IDEFIX\n",
    "se chiffre en :\n",
    "\n",
    "    FDSWXUHC LGHILA\n",
    "\n",
    "\n",
    "On peut bien sur modifier le décalage.  \n",
    "\n",
    "Cette technique reste assez simple, **il faudra proposer** :  \n",
    "* la possibilité de **choisir une valeur de décalage**\n",
    "* le **chiffrement d'un caractère** en tenant compte de ce décalage. \n",
    "* le **chiffrement d'une phrase complète** (tenir des caractères spéciaux : les espaces, les chiffres..)  \n",
    "* le **déchiffement d'une phrase chiffrée en connaissant le décalage**.  \n",
    "* la possibilité de **déchiffrer une phrase chiffrée sans connaitre le décalage initiale**."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "425b6c98",
   "metadata": {},
   "source": [
    "### 2. Chiffrement par substitution\n",
    "Le chiffre de César est trop facile à attaquer, même si on ne connaît pas le décalage. Pour compliquer la tâche d’un espion, on introduit le chiffrement par substitution.  \n",
    "À chaque lettre de l’alphabet en clair , on associe une lettre au hasard.  \n",
    "Voici un exemple :  \n",
    "![correspondance](assets/correspondance.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "60d9fd77",
   "metadata": {},
   "source": [
    "**Chiffrement**. On remplace chaque caractère du message par sa lettre substituée.  \n",
    "Le message `BONJOUR` devient `kbnzbhq`.  \n",
    "\n",
    "**Déchiffrement**. On fait l’opération inverse : `kbnkbn` donne `BONBON`.  \n",
    "\n",
    "**Il faudra proposer** :  \n",
    "* un **alphabet aléatoire** qui correspond à un **mélange de lettre** comme par exemple : `ykcodmfjgzaxrnbutqiphwesvl`  \n",
    "* le **chiffrement d'un caractère puis d'une phrase en tenant compte du mélange obtenue**.  \n",
    "* le **déchiffrement d'une phrase chiffrée en connaissant le mélange de lettre**."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4f82f774",
   "metadata": {},
   "source": [
    "Pour un espion qui intercepterait un message codé, sans connaître la substitution choisie, il n’est plus possible de tester toutes les possibilités.  \n",
    "En effet, il y a 26 x 25 x 24 x..... x 2 x 1 choix possibles pour l’alphabet mélangé, ce qui fait environ 4 x $10^{26}$ clés !  \n",
    "\n",
    "Dans ce cas, on propose de déchiffrer ces messages par **attaque statistique**\n",
    "\n",
    "### 3. Attaque statistique\n",
    "Pour un texte assez long, les lettres n’apparaissent pas toutes avec la même fréquence.   \n",
    "En français, les lettres les plus rencontrées sont dans l’ordre :  \n",
    "\n",
    "    E S A I N T R U L O D C P M V Q G F H B X J Y Z K W\n",
    "\n",
    "La fréquence d’apparition d’une lettre est donnée par la formule :\n",
    "\n",
    "$fréquence~d’apparition~d’une~lettre = \\frac{(nombre~d’occurrences~de~la~lettre)}{(nombre~total~de~lettres)}$ x 100\n",
    "\n",
    "Dans un texte en français les fréquences sont proches de :  \n",
    "![frequence](assets/frequence_apparition.png)\n",
    "\n",
    "On a intercepté un message, mais on ne connaît pas la substitution.  \n",
    "**Comment utiliser les statistiques pour déchiffrer le message ?**  \n",
    "\n",
    "Voici une méthode d’attaque : dans le texte chiffré, on cherche la lettre qui apparaît le plus, et si le texte est assez long, cela devrait être le chiffrement du `E`, la lettre qui apparaît ensuite dans l’étude des fréquences devrait être le chiffrement du `S`, puis le chiffrement du `A, I, N, T`...  \n",
    "\n",
    "On obtient ainsi un déchiffrement partiel du message, sous la forme **d’un texte à trous** et il faut ensuite deviner les lettres manquantes.  \n",
    "\n",
    "Un exemple.  \n",
    "Déchiffrons la phrase :  \n",
    "\n",
    "    jm dw ug jddbhbwm y jmlj cjtljtdjd\n",
    "    \n",
    "On compte les apparitions des lettres :\n",
    "\n",
    "    j : 7 \td : 5 \tm : 3 \tb, l, t, w : 2\n",
    "\n",
    "On suppose donc que le j chiffre la lettre E, le d la lettre S, ce qui donne :\n",
    "\n",
    "    E* S* ** ESS***** * E**E *E**E*SES\n",
    "\n",
    "Ensuite la lettre qui apparaît le plus est le `m`. D’après les fréquences, elle devrait correspondre à `A, I, N\n",
    "ou T`.  \n",
    "Ainsi le premier mot serait `EA`, `EI`, `EN` ou `ET`. Seuls les deux derniers sont des mots valides.  \n",
    "\n",
    "Si `m` -> `N`, la phrase se déchiffre en :  \n",
    "\n",
    "    EN S* ** ESS****N * EN*E *E**E*SES\n",
    "    \n",
    "ce qui n’est pas très clair, alors qu’avec `m` -> `T` c’est mieux !  \n",
    "\n",
    "    ET S* ** ESS****T * ET*E *E**E*SES\n",
    "    \n",
    "En cherchant où placer les lettres les plus fréquentes suivantes (`A, I, N`) puis les autres, avec un peu de patience et de bon sens, on déchiffre le message :\n",
    "\n",
    "    ET SI ON ESSAYAIT D ETRE HEUREUSES\n",
    "\n",
    "**Il faudra proposer cette méthode d'attaque statistique pour déchiffrer un message chiffré par la méthode de chiffrement par substitution dont on ne connait pas le méménage des lettres ayant servi à chiffrer.**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4fd1e63b",
   "metadata": {},
   "source": [
    "### Énigmes. \n",
    "Essayer de déchiffrer les trois citations suivantes. Chacune a été chiffrée par une substitution différente.\n",
    "Les frères Goncourt :  \n",
    "\n",
    "    ay dmymndmnxlv vdm ay shvjnvhv fvd dznvgzvd ngvcyzmvd\n",
    "\n",
    "Charles Darwin :\n",
    "\n",
    "    apy pywpfpy tdv ydjsvspng np ybng woy apy pywpfpy apy wady lbjgpy nv apy wady\n",
    "    vngpaavzpngpy movy fpaapy tdv y okowgpng ap mvpdc odc fionzpmpngy\n",
    "\n",
    "Albert Einstein :\n",
    "\n",
    "    kw yjnzfcn, i nmy lqwpx zp mwcy yzqy ny lqn fcnp pn azpiyczppn. kw ofwyclqn, i nmy lqwpx\n",
    "    yzqy azpiyczppn ny lqn onfmzppn pn mwcy ozqflqzc. cic, pzqm wszpm fnqpc yjnzfcn ny\n",
    "    ofwyclqn : fcnp pn azpiyczppn ny onfmzppn pn mwcy ozqflqzc !\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c872baf4",
   "metadata": {},
   "source": [
    "### 4. Le chiffrement de Vigenère\n",
    "Un des principaux défauts du chiffre de César (et du chiffrement par substitution) est qu’une lettre (par exemple A) est toujours chiffrée par la même lettre (par exemple D).  \n",
    "Le chiffrement de Vigenère est une version améliorée du chiffre de César.  \n",
    "\n",
    "On regroupe d’abord les lettres de notre message par blocs, par exemple ici par blocs de longueur 3 :\n",
    "\n",
    "    IL ETAIT UNE FOIS\n",
    "    \n",
    "devient\n",
    "\n",
    "    ILE TAI TUN EFO IS\n",
    "    \n",
    "(les espaces sont purement indicatifs, dans la première phrase ils séparent les mots, dans la seconde ils séparent les blocs).  \n",
    "\n",
    "Si `n` est la longueur d’un bloc, alors on choisit une clé constituée de **n nombres de 0 à 25** : `[k1, k2, . . . , kn]`.  \n",
    "\n",
    "Le chiffrement consiste à effectuer un chiffrement de César, dont le décalage dépend du rang de la lettre dans le bloc :\n",
    "•\tun décalage de k1 pour la première lettre de chaque bloc,  \n",
    "•\tun décalage de k2 pour la deuxième lettre de chaque bloc,  \n",
    "•\t...  \n",
    "•\tun décalage de kn pour la n-ème et dernière lettre de chaque bloc.  \n",
    "\n",
    "Pour notre exemple, si on choisit comme clé `[4, 2, 3]` alors pour le premier bloc `ILE` :  \n",
    "•\tun décalage de 4 pour `I` donne `M`     \n",
    "•\tun décalage de 2 pour `L` donne `N`     \n",
    "•\tun décalage de 3 pour `E` donne `H`     \n",
    "\n",
    "Ainsi `ILE` devient `MNH`. On recommence avec le bloc `TAI` qui devient `XCL`. Le chiffrement complet donne :\n",
    "\n",
    "    MNH XCL XWQ IHR MU\n",
    "\n",
    "autrement dit la phrase chiffrée est :\n",
    "    \n",
    "    MN HXCLX WQI HRMU\n",
    "\n",
    "**Il faudra proposer** :\n",
    "* le **découpage d'une phrase en bloc** de n lettres\n",
    "* la **création d'une clé** de n nombres de 0 à 25\n",
    "* le **chiffrement de chaque lettre** d'un bloc par la clé pour aboutir à un message chiffré.\n",
    "\n",
    "Peut-être pouvez-vous proposer de dechiffrer un message ? Dans ce cas essayer de déchiffrer le message suivant (et trouvez son auteur) qui a été codé par un chiffrement de Vigenère avec une clé (inconnue !) de longueur 4.\n",
    "\n",
    "    DL ZHGIVUEL OD UL LQK TYDVL OIL XEU DLC YEIOSASOI KVXJ KBBI WA PYWYC T WBH\n",
    "    QDVBI IBO BWZ QUFZ SDLLVBANODLZ CEFA OCHSSI VL NEMAOI\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "35d5473d",
   "metadata": {},
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
