Files
TermNSI/Sécurité/TD.ipynb

270 lines
12 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"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 sagit tout simplement de décaler chaque lettre du message. \n",
"Voyons lexemple dun 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 dun espion, on introduit le chiffrement par substitution. \n",
"À chaque lettre de lalphabet 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 lopé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 nest 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 lalphabet 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 napparaissent pas toutes avec la même fréquence. \n",
"En français, les lettres les plus rencontrées sont dans lordre : \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 dapparition dune lettre est donnée par la formule :\n",
"\n",
"$fréquence~dapparition~dune~lettre = \\frac{(nombre~doccurrences~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 dattaque : 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 **dun 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`. Daprè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 nest pas très clair, alors quavec `m` -> `T` cest 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 quune 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 dabord 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 dun 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
}