diff --git a/SQL/TP_Dossier_Dudley.md b/SQL/TP_Dossier_Dudley.md new file mode 100644 index 0000000..abf36d7 --- /dev/null +++ b/SQL/TP_Dossier_Dudley.md @@ -0,0 +1,374 @@ +# TP : Dossier Dudley — une enquête épidémiologique + +## Contexte + +Vous êtes analyste de données au **Centre de veille sanitaire**. On vous confie un dossier +concernant **Dudley**, une petite commune rurale de l'Arkansas organisée autour d'une seule +entreprise : l'usine de transformation de volaille **Chaco Chicken**. + +Le signalement est bref : + +> *Plusieurs habitants de Dudley sont décédés récemment d'une maladie neurologique rare, +> la maladie de Creutzfeldt-Jakob. Le nombre de cas paraît anormalement élevé pour une +> commune de cette taille. Un inspecteur fédéral de l'agriculture envoyé sur place au +> mois de mars a disparu.* + +Vous disposez de six tables : l'état civil, les emplois à l'usine, les diagnostics +enregistrés par le cabinet médical, les repas communautaires organisés dans la commune, +la liste des participants à ces repas, et les disparitions signalées. + +**Votre mission : trouver la source de la contamination, uniquement avec des requêtes SQL.** + +> *Ce TP s'inspire librement de l'épisode « Our Town » (X-Files, saison 2). Le mécanisme +> biologique, lui, est réel : les maladies à prions se transmettent par l'alimentation. +> C'est ce mécanisme qui a provoqué la crise de la « vache folle » en Europe dans les +> années 1990.* + +--- + +## Objectifs + +- Interroger une base de données relationnelle à six tables +- Maîtriser les jointures, y compris à travers une table d'association +- Utiliser les fonctions d'agrégation (`COUNT`, `AVG`, `MIN`, `MAX`) et la clause `HAVING` +- Comprendre qu'une requête n'est pas seulement un exercice de syntaxe : c'est un + **instrument d'enquête** + +--- + +## Partie 1 : Mise en place de la base + +### 1.1. Création des tables + +Ouvrez **DB Browser for SQLite**, créez une base `dudley.db`, puis exécutez : + +```sql +-- État civil de la commune et des environs +CREATE TABLE HABITANTS ( + id INTEGER PRIMARY KEY, + nom TEXT NOT NULL, + prenom TEXT NOT NULL, + annee_naissance INTEGER, + annee_deces INTEGER, -- NULL si la personne est vivante + commune TEXT +); + +-- Emplois occupés à l'usine Chaco Chicken +CREATE TABLE EMPLOIS ( + id INTEGER PRIMARY KEY, + id_habitant INTEGER, + poste TEXT, + annee_embauche INTEGER, + annee_fin INTEGER, -- NULL si toujours en poste + FOREIGN KEY (id_habitant) REFERENCES HABITANTS(id) +); + +-- Diagnostics enregistrés par le cabinet médical +CREATE TABLE DIAGNOSTICS ( + id INTEGER PRIMARY KEY, + id_habitant INTEGER, + annee INTEGER, + symptome TEXT, + diagnostic TEXT, + FOREIGN KEY (id_habitant) REFERENCES HABITANTS(id) +); + +-- Repas communautaires organisés dans la commune +CREATE TABLE REPAS ( + id INTEGER PRIMARY KEY, + date DATE, + lieu TEXT, + occasion TEXT +); + +-- Table d'association : qui a participé à quel repas +CREATE TABLE PARTICIPATIONS ( + id INTEGER PRIMARY KEY, + id_habitant INTEGER, + id_repas INTEGER, + FOREIGN KEY (id_habitant) REFERENCES HABITANTS(id), + FOREIGN KEY (id_repas) REFERENCES REPAS(id) +); + +-- Disparitions signalées à la gendarmerie +CREATE TABLE DISPARITIONS ( + id INTEGER PRIMARY KEY, + id_habitant INTEGER, + date_disparition DATE, + statut_enquete TEXT, + FOREIGN KEY (id_habitant) REFERENCES HABITANTS(id) +); +``` + +### 1.2. Insertion des données + +```sql +-- ------------------------------------------------------------------ +-- HABITANTS +-- ------------------------------------------------------------------ +INSERT INTO HABITANTS (id, nom, prenom, annee_naissance, annee_deces, commune) VALUES +-- Dudley : les anciens +(1, 'Chaco', 'Walter', 1902, NULL, 'Dudley'), +(2, 'Riddick', 'Doris', 1891, 1988, 'Dudley'), +(3, 'Bowman', 'Elias', 1888, 1985, 'Dudley'), +(4, 'Kingston', 'Martha', 1893, 1989, 'Dudley'), +(5, 'Prine', 'Howard', 1890, 1987, 'Dudley'), +(6, 'Sheldon', 'Rita', 1895, 1989, 'Dudley'), +(7, 'Farrow', 'Nelson', 1899, 1989, 'Dudley'), +-- Dudley : décès récents +(8, 'Gwynn', 'Paula', 1957, 1995, 'Dudley'), +(9, 'Kittel', 'Ray', 1949, 1995, 'Dudley'), +(10, 'Vance', 'Bonnie', 1962, 1994, 'Dudley'), +(11, 'Hooper', 'Jess', 1954, 1994, 'Dudley'), +(12, 'Traylor', 'Sam', 1960, 1995, 'Dudley'), +(13, 'Doyle', 'Nancy', 1951, 1995, 'Dudley'), +-- Dudley : vivants +(14, 'Ashby', 'Curtis', 1965, NULL, 'Dudley'), +(15, 'Lowell', 'Beatrice', 1970, NULL, 'Dudley'), +(16, 'Pruitt', 'Wendell', 1958, NULL, 'Dudley'), +(17, 'Kearns', 'George', 1948, NULL, 'Dudley'), +-- Millhaven : commune voisine, prise comme référence +(18, 'Sorrel', 'Agnes', 1912, 1988, 'Millhaven'), +(19, 'Buckley', 'Harold', 1918, 1994, 'Millhaven'), +(20, 'Neame', 'Constance', 1921, 1995, 'Millhaven'), +(21, 'Ferrell', 'Douglas', 1908, 1986, 'Millhaven'), +(22, 'Whitlock', 'Irene', 1925, 1993, 'Millhaven'), +(23, 'Amos', 'Leonard', 1915, 1989, 'Millhaven'), +(24, 'Bly', 'Marjorie', 1930, NULL, 'Millhaven'), +-- Dudley : deux dossiers anciens +(25, 'Guthrie', 'Samuel', 1935, NULL, 'Dudley'), +(26, 'Lomax', 'Edna', 1940, NULL, 'Dudley'); + +-- ------------------------------------------------------------------ +-- EMPLOIS (usine Chaco Chicken) +-- ------------------------------------------------------------------ +INSERT INTO EMPLOIS (id, id_habitant, poste, annee_embauche, annee_fin) VALUES +(1, 1, 'Directeur', 1944, NULL), +(2, 2, 'Ouvriere de decoupe', 1932, 1972), +(3, 4, 'Contremaitresse', 1935, 1975), +(4, 5, 'Veterinaire', 1930, 1970), +(5, 7, 'Ouvrier de decoupe', 1938, 1978), +(6, 8, 'Ouvriere de decoupe', 1978, 1994), +(7, 9, 'Conducteur de ligne', 1971, 1995), +(8, 10, 'Ouvriere de decoupe', 1984, 1994), +(9, 11, 'Agent d''entretien', 1976, 1994), +(10, 12, 'Conducteur de ligne', 1982, 1995), +(11, 13, 'Ouvriere de conditionnement', 1973, 1995), +(12, 14, 'Conducteur de ligne', 1988, NULL), +(13, 15, 'Ouvriere de conditionnement', 1992, NULL), +(14, 16, 'Chef d''equipe', 1980, NULL), +(15, 26, 'Ouvriere de conditionnement', 1962, 1988); + +-- ------------------------------------------------------------------ +-- DIAGNOSTICS +-- ------------------------------------------------------------------ +INSERT INTO DIAGNOSTICS (id, id_habitant, annee, symptome, diagnostic) VALUES +(1, 8, 1993, 'Troubles de la coordination', 'Trouble neurologique non identifie'), +(2, 8, 1994, 'Demence rapide', 'Maladie de Creutzfeldt-Jakob'), +(3, 9, 1994, 'Pertes de memoire', 'Trouble neurologique non identifie'), +(4, 9, 1995, 'Myoclonies', 'Maladie de Creutzfeldt-Jakob'), +(5, 10, 1993, 'Troubles de la vision', 'Trouble neurologique non identifie'), +(6, 10, 1994, 'Demence rapide', 'Maladie de Creutzfeldt-Jakob'), +(7, 11, 1993, 'Troubles de la coordination', 'Maladie de Creutzfeldt-Jakob'), +(8, 12, 1994, 'Myoclonies', 'Maladie de Creutzfeldt-Jakob'), +(9, 13, 1994, 'Pertes de memoire', 'Maladie de Creutzfeldt-Jakob'), +(10, 14, 1994, 'Fracture du poignet', 'Traumatisme'), +(11, 15, 1995, 'Angine', 'Infection ORL'), +(12, 19, 1993, 'Douleurs thoraciques', 'Insuffisance cardiaque'), +(13, 22, 1992, 'Toux persistante', 'Cancer du poumon'), +(14, 2, 1987, 'Fatigue', 'Vieillissement'), +(15, 16, 1994, 'Lombalgie', 'Trouble musculo-squelettique'); + +-- ------------------------------------------------------------------ +-- REPAS communautaires +-- ------------------------------------------------------------------ +INSERT INTO REPAS (id, date, lieu, occasion) VALUES +(1, '1988-09-17', 'Ferme Chaco', 'Banquet annuel Chaco Chicken'), +(2, '1989-06-24', 'Salle des fetes', 'Fete de la moisson'), +(3, '1990-09-15', 'Ferme Chaco', 'Banquet annuel Chaco Chicken'), +(4, '1992-12-24', 'Eglise de Dudley', 'Reveillon de Noel'), +(5, '1995-03-11', 'Ferme Chaco', 'Banquet annuel Chaco Chicken'); + +-- ------------------------------------------------------------------ +-- PARTICIPATIONS +-- ------------------------------------------------------------------ +INSERT INTO PARTICIPATIONS (id, id_habitant, id_repas) VALUES +-- Repas 1 (17 septembre 1988) +(1, 8, 1), (2, 9, 1), (3, 10, 1), (4, 11, 1), (5, 12, 1), (6, 13, 1), +(7, 1, 1), (8, 2, 1), (9, 4, 1), (10, 14, 1), (11, 16, 1), +-- Repas 2 (24 juin 1989) +(12, 8, 2), (13, 9, 2), (14, 10, 2), (15, 11, 2), +(16, 1, 2), (17, 14, 2), (18, 15, 2), (19, 16, 2), +-- Repas 3 (15 septembre 1990) +(20, 8, 3), (21, 9, 3), (22, 12, 3), (23, 13, 3), +(24, 1, 3), (25, 14, 3), (26, 16, 3), (27, 17, 3), +-- Repas 4 (24 decembre 1992) +(28, 9, 4), (29, 10, 4), (30, 11, 4), (31, 12, 4), (32, 13, 4), +(33, 15, 4), (34, 16, 4), +-- Repas 5 (11 mars 1995) +(35, 1, 5), (36, 14, 5), (37, 15, 5), (38, 16, 5), (39, 24, 5); + +-- ------------------------------------------------------------------ +-- DISPARITIONS +-- ------------------------------------------------------------------ +INSERT INTO DISPARITIONS (id, id_habitant, date_disparition, statut_enquete) VALUES +(1, 25, '1961-07-22', 'Classee sans suite'), +(2, 26, '1988-09-14', 'Classee sans suite'), +(3, 17, '1995-03-08', 'En cours'); +``` + +> **Remarque.** Les accents ont été retirés des données pour éviter tout problème +> d'encodage selon les postes. Les apostrophes des textes SQL sont doublées (`d''entretien`) : +> c'est la façon d'écrire une apostrophe *à l'intérieur* d'une chaîne. + +### 1.3. Schéma relationnel + +Dessinez le schéma de la base en identifiant les clés primaires (PK) et les clés +étrangères (FK). + +**Question de mise en route :** la table `PARTICIPATIONS` ne contient aucune information +« propre » — que des clés étrangères. À quoi sert-elle ? Pourquoi ne peut-on pas simplement +ajouter une colonne `id_repas` dans `HABITANTS` ? + +--- + +## Partie 2 : Prise en main (requêtes simples) + +**Pour chaque question, écrivez la requête et notez le résultat obtenu.** + +**1.** Affichez le nom, le prénom et l'année de naissance de tous les habitants de Dudley, +triés du plus âgé au plus jeune. + +**2.** Affichez le nom et le prénom des habitants encore en vie. +*(Indice : une valeur absente se teste avec `IS NULL`, pas avec `= NULL`.)* + +**3.** Affichez la liste des postes différents occupés à l'usine Chaco Chicken, sans doublon. + +**4.** Affichez la date et l'occasion des repas qui se sont tenus à la Ferme Chaco. + +--- + +## Partie 3 : Croiser les tables (jointures) + +**5.** Affichez le nom, le prénom et le poste de chaque personne ayant travaillé à l'usine. + +**6.** Affichez le nom, le prénom et l'année du diagnostic de tous les habitants +diagnostiqués `'Maladie de Creutzfeldt-Jakob'`. + +**7.** Affichez le nom et le prénom de toutes les personnes ayant participé au repas +du 17 septembre 1988. +*(Indice : il faut passer par `PARTICIPATIONS`, donc joindre trois tables.)* + +**8.** Affichez le nom, le prénom, la date et le statut de l'enquête pour chaque disparition +signalée. + +**9.** Affichez le nom et le prénom des habitants de Dudley qui n'ont **jamais** travaillé +à l'usine. +*(Indice : `NOT IN (SELECT ...)` ou une jointure externe.)* + +--- + +## Partie 4 : Compter et mesurer (agrégations) + +**10.** Combien y a-t-il d'habitants recensés dans chaque commune ? + +**11.** Pour chaque repas, affichez sa date et son nombre de participants. + +**12.** Pour chaque commune, calculez l'âge moyen au décès des personnes décédées. +*(Indice : l'âge au décès se calcule à partir de deux colonnes.)* + +**13.** Combien de fois chaque diagnostic apparaît-il dans la base ? Classez du plus +fréquent au moins fréquent. + +**14.** Quels habitants ont participé à au moins 3 repas ? Affichez leur nom et leur nombre +de participations. + +--- + +## Partie 5 : Une anomalie + +Les résultats de la question 12 méritent qu'on s'y arrête. Reprenons-les en séparant +les époques. + +**15.** Pour chaque commune, calculez l'âge moyen au décès **des personnes décédées avant 1990**. +Que constatez-vous pour Dudley ? + +**16.** Même question pour les personnes décédées **à partir de 1990**. Comparez les deux +résultats commune par commune. + +> Rédigez deux ou trois phrases : que s'est-il passé à Dudley entre ces deux périodes ? +> Le même phénomène s'observe-t-il à Millhaven ? + +**17.** Affichez le nom, le prénom et l'âge au décès de chaque personne diagnostiquée +`'Maladie de Creutzfeldt-Jakob'`. Combien sont-elles ? Toutes appartiennent-elles à la +même commune ? + +--- + +## Partie 6 : La source + +Vous avez maintenant un groupe de malades identifié. En épidémiologie, la question suivante +est toujours la même : **qu'ont-ils en commun que les autres n'ont pas ?** + +**18.** Trouvez **le repas auquel ont participé toutes les personnes** diagnostiquées +`'Maladie de Creutzfeldt-Jakob'`, et uniquement celui-là. + +*Indice :* comptez, pour chaque repas, le nombre de malades présents, puis ne gardez que +les repas où ce nombre est égal au nombre total de malades. La clause qui filtre **après** +un regroupement s'appelle `HAVING`. + +**19.** Affichez chaque disparition signalée, accompagnée du repas qui a eu lieu dans les +**7 jours suivants**, s'il y en a un. + +*Indice :* en SQLite, `date(d.date_disparition, '+7 days')` renvoie la date décalée de +sept jours. Vous pouvez alors comparer directement les dates entre elles. + +**20.** Le dernier banquet a eu lieu le 11 mars 1995. Affichez le nom et le prénom de ses +participants, et indiquez pour chacun s'il figure ou non dans la table `DIAGNOSTICS` +avec le diagnostic `'Maladie de Creutzfeldt-Jakob'`. + +> **Rédigez la conclusion de votre rapport (5 à 10 lignes).** Quelle est la source probable +> de la contamination ? Quel lien faites-vous entre les dates des banquets et celles des +> disparitions ? Et surtout : au vu de la question 20, l'affaire est-elle close ? + +--- + +## Questions de réflexion + +**1.** Pourquoi avoir séparé `HABITANTS` et `EMPLOIS` dans deux tables, plutôt que d'ajouter +une colonne `poste` dans `HABITANTS` ? + +**2.** À la question 18, on compte les malades présents à chaque repas. Un même habitant +peut apparaître plusieurs fois dans `DIAGNOSTICS`. En quoi cela pourrait-il fausser le +comptage, et comment s'en prémunir ? + +**3.** L'incubation d'une maladie à prion dure souvent **plus de dix ans** entre la +contamination et les premiers symptômes. En quoi ce délai rend-il ce type d'enquête +difficile ? Quelles données faudrait-il conserver, et pendant combien de temps ? + +**4.** La base ne contient que les repas *déclarés* et les disparitions *signalées*. +Quelles conclusions cela vous interdit-il de tirer ? Formulez une phrase précisant ce que +vos requêtes démontrent réellement, et ce qu'elles ne font que suggérer. + +--- + +## Barème indicatif + +| Partie | Points | +|--------|--------| +| Partie 1 : schéma et question de mise en route | 2 | +| Partie 2 : requêtes simples | 3 | +| Partie 3 : jointures | 4 | +| Partie 4 : agrégations | 4 | +| Partie 5 : anomalie + rédaction | 3 | +| Partie 6 : source + conclusion | 3 | +| Questions de réflexion | 1 | +| **Total** | **20** | + +--- + +Auteur : Florian Mathieu + +Licence CC BY NC + +Licence Creative Commons
Ce cours est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International. diff --git a/Sécurité/TP_Bande_Du_Penseur.md b/Sécurité/TP_Bande_Du_Penseur.md new file mode 100644 index 0000000..f69f769 --- /dev/null +++ b/Sécurité/TP_Bande_Du_Penseur.md @@ -0,0 +1,451 @@ +# TP : La bande du Penseur + +## Contexte + +Un informaticien surnommé **le Penseur** est parvenu à extraire des serveurs du +ministère de la Défense une archive de documents classifiés, produits par un comité +interne baptisé **Majestic Twelve** (en abrégé : MJ-12). Il a copié le tout sur une +bande numérique et l'a transmise à un enquêteur. + +La bande contient **trois fichiers**. Aucun n'est lisible directement. + +Vous êtes chargé·e de les ouvrir, dans l'ordre : chaque fichier contient l'information +nécessaire pour aborder le suivant. + +Ce TP est aussi, et peut-être surtout, une enquête sur une question de fond : +**qu'est-ce qui protège réellement un message ?** + +> *Ce TP s'inspire de l'épisode « Anasazi » (X-Files, saison 2, épisode 25, diffusé le +> 19 mai 1995). La partie 6 revient sur l'épisode et sur ce qu'il raconte - vous pouvez +> la lire dès maintenant, elle ne dévoile rien des solutions.* + +--- + +## Objectifs + +- Attaquer un chiffrement par **analyse de fréquences** +- Attaquer un chiffrement **XOR** à clé courte par **force brute** +- Comprendre la différence entre le **secret de l'algorithme** et le **secret de la clé** +- Découvrir et formuler le **principe de Kerckhoffs** +- Connaître l'histoire des **code talkers navajos** et ce qu'elle apprend en cryptographie + +--- + +## Partie 1 : Le premier fichier + +### 1.1. Ce qu'on sait + +Le fichier `fichier1.txt` a été chiffré par le comité avec un système **conçu en interne**, +dont les spécifications n'ont jamais été publiées. D'après une note retrouvée, chaque +lettre du message a été systématiquement remplacée par une autre lettre, toujours la même. +Espaces et ponctuation ont été conservés. + +Voici son contenu : + +``` +YKLF QF PFWCNMF NYLFWYF. JF AWFPFYL QKMSIFYL YF QKNL FY HSMSY MHP ZSNLLFW +JF PFWCNMF. JFP FJFIFYLP WHPPFIDJFP QFASNP QNR HYP PSW JF AWKBFL PKYL +QFPKWIHNP WFSYNP QHYP SY PFSJ QKPPNFW. YKSP HCKYP MOKNPN QF YF AHP SLNJNPFW +JFP PVPLFIFP QF MONUUWFIFYL QS INYNPLFWF, QKYL JFP PAFMNUNMHLNKYP PKYL +ASDJNZSFP FL QKYM CSJYFWHDJFP. YKLWF AWKAWF IFLOKQF, MKYMSF FY NYLFWYF FL +MKYYSF QFP PFSJP IFIDWFP QS MKINLF, KUUWF SYF AWKLFMLNKY DNFY PSAFWNFSWF +ASNPZSF AFWPKYYF H J FRLFWNFSW Y FY MKYYHNL JF AWNYMNAF. JH MJF QS PFMKYQ +UNMONFW FPL SY IKL QF LWKNP JFLLWFP ZSN QFPNEYF JF MKINLF JSN IFIF. +``` + +### 1.2. Travail demandé + +**Q1.** Quel type de chiffrement reconnaissez-vous ? Est-ce un chiffre de César ? +Justifiez en observant le texte : le décalage est-il le même pour toutes les lettres ? + +**Q2.** Écrivez une fonction qui compte les occurrences de chaque lettre du texte chiffré +et affiche les résultats du plus fréquent au moins fréquent. + +```python +def frequences(texte): + """Renvoie la liste des couples (lettre, nombre d'occurrences), + triee par nombre d'occurrences decroissant. + Les caracteres qui ne sont pas des lettres sont ignores.""" + ... +``` + +**Q3.** En français, les lettres les plus fréquentes sont, dans l'ordre : +**E, A, S, I, N, T, R, U, L, O**. Le texte compte 474 lettres, ce qui est suffisant +pour que la statistique soit fiable. + +Quelle lettre du texte chiffré correspond très probablement à `E` ? Et à la deuxième +lettre la plus fréquente ? + +**Q4.** Le mot d'une seule lettre `H` apparaît dans le texte, ainsi que `J` et `Y`. +En français, quels sont les mots d'une seule lettre ? Que vous apprend cette observation ? + +**Q5.** Complétez progressivement votre table de correspondance et déchiffrez le message. +Vous pouvez travailler par essais successifs : remplacez les lettres dont vous êtes sûr·e, +puis devinez les mots partiellement révélés. + +```python +def dechiffre(texte, table): + """Remplace chaque lettre de texte selon le dictionnaire table. + Les lettres absentes de table sont laissees telles quelles.""" + ... +``` + +**Q6.** Le message se vante d'une protection « bien supérieure » à celle du ministère, +au motif que personne à l'extérieur n'en connaît le principe. + +**Combien de temps vous a-t-il fallu pour le lire ?** Que pensez-vous de l'argument ? + +--- + +## Partie 2 : Le deuxième fichier + +### 2.1. Ce qu'on sait + +Le premier fichier vous a indiqué la nature de la clé du second. Le fichier `fichier2.hex` +a été chiffré par **XOR** — l'opération que vous avez déjà utilisée dans le TP du +gestionnaire de mots de passe — avec une **clé de trois lettres majuscules**, répétée +tout au long du message. + +Le contenu est donné en **hexadécimal** (deux caractères par octet) : + +``` +0e05191d1e116d1811030e016d0e016d091b000300086474010f7419181b04191d0807116d +0c1d0e021d081874036a111e1e741d0b076d091c040c121f0f7a6d03186d0f07196a06080e +1d0a0f74090b1a1e6a01030f74010b1a0a1f116d1b01086a041f0f071c1f116d1a111f191b +0304116d04116d1a151f06116d0f006d1b01046a1a086a076d0f171f03006d1a151e64740c +1f171804116d07150e021d030f74030f741d05011f18156d0015000b1d1e6a18086a180418 +11636a176d0f07196a180c6a19080318010f011f0f741d181b190f1719031b036a05180374 +1e051d196474191815031919081e001f0f740c1f741e0300086a10086a07190517060b1308 +64 +``` + +### 2.2. Travail demandé + +**Q7.** Rappelez la propriété du XOR qui rend le déchiffrement possible : +que vaut `A XOR B XOR B` ? + +**Q8.** Convertissez la chaîne hexadécimale en octets, puis écrivez la fonction de +déchiffrement. + +```python +donnees = bytes.fromhex(HEXA) # HEXA = la chaine ci-dessus, sans retours a la ligne + +def xor(donnees, cle): + """Renvoie les octets de donnees combines par XOR avec la cle, + repetee autant de fois que necessaire.""" + ... +``` + +**Q9.** La clé fait trois lettres majuscules. **Combien de clés faut-il tester au +maximum ?** Ce nombre est-il un obstacle pour un ordinateur ? + +**Q10.** Écrivez une attaque par force brute. Le problème n'est pas de produire les +17 576 déchiffrements — c'est de **reconnaître automatiquement le bon**. + +Proposition : le message clair ne contient que des majuscules, des espaces, des points +et des virgules. Écrivez une fonction qui teste si un déchiffrement ne contient +**que** des caractères de cet ensemble, et n'affichez que les clés qui passent ce test. + +```python +AUTORISES = set("ABCDEFGHIJKLMNOPQRSTUVWXYZ .,") + +def est_plausible(octets): + """Renvoie True si octets se decode en ASCII et si tous ses caracteres + appartiennent a AUTORISES.""" + ... +``` + +**Q11.** Combien de clés passent le test ? Déchiffrez le message. + +**Q12.** À quoi correspondent les trois lettres de la clé ? Quelqu'un qui connaît le +contexte de l'affaire aurait-il eu besoin de la force brute ? + +**Q13.** Cette fois, l'algorithme était **public** : vous saviez dès le départ qu'il +s'agissait d'un XOR. Pourtant le fichier est tombé. **Qu'est-ce qui a échoué ici : +l'algorithme, ou la clé ?** + +--- + +## Partie 3 : Le troisième fichier + +### 3.1. Ce qu'on sait + +Le deuxième fichier annonce que le troisième **n'est pas chiffré**. + +Le voici, dans son intégralité : + +``` +NA-NIL-IN BEH-EH-HO-ZINZ +TSA-OND +WOL-LA-CHEE TSAH BE-LA-SANA DIBEH TSE-NILL BESH-DO-TLIZ TKIN +``` + +### 3.2. Première approche + +**Q14.** Appliquez votre fonction `frequences` de la question 2 à ce texte. +Le résultat vous aide-t-il ? Pourquoi ? + +**Q15.** Pourriez-vous monter une attaque par force brute ? Sur quoi porterait-elle ? +Combien de possibilités devriez-vous tester ? + +**Q16.** À ce stade, expliquez en deux phrases **pourquoi vous êtes bloqué·e**. +La difficulté est-elle de nature mathématique ? + +### 3.3. Le lexique + +Voici un extrait du document qui permet de lire le fichier. Il s'agit d'un extrait +authentique du **dictionnaire des code talkers navajos**, dans sa révision du +15 juin 1945, déclassifié en 1968. + +**Vocabulaire** + +| Terme navajo | Traduction littérale | Sens codé | +|---|---|---| +| NA-NIL-IN | *kept secret* | CONFIDENTIEL | +| BEH-EH-HO-ZINZ | *document* | DOCUMENT | +| TSA-OND | *rock cave* | GROTTE | + +**Alphabet** (chaque mot vaut la **première lettre** de sa traduction anglaise) + +| Terme navajo | Traduction littérale | Lettre | +|---|---|---| +| WOL-LA-CHEE | *ant* (fourmi) | **A** | +| BE-LA-SANA | *apple* (pomme) | **A** | +| TSE-NILL | *axe* (hache) | **A** | +| TSAH | *needle* (aiguille) | **N** | +| DIBEH | *sheep* (mouton) | **S** | +| BESH-DO-TLIZ | *zinc* | **Z** | +| TKIN | *ice* (glace) | **I** | + +**Q17.** Déchiffrez le fichier. Combien de temps cela vous a-t-il pris, une fois le +lexique en main ? + +**Q18.** Observez les trois premières lignes du tableau de l'alphabet. **Trois mots +différents désignent la même lettre.** À votre avis, pourquoi les concepteurs du code +ont-ils fait ce choix ? Reliez votre réponse à la question 14. + +--- + +## Partie 4 : Les code talkers navajos — ce qui s'est réellement passé + +*Cette partie est à lire. Elle ne demande pas de programmation, mais deux questions +sont posées à la fin.* + +### Le problème + +Au début de 1942, dans le Pacifique, les transmissions radio américaines sont +systématiquement interceptées et décryptées par l'armée japonaise. Les chiffrements +mécaniques disponibles sont sûrs mais lents : coder puis décoder un ordre demande de +longues minutes, ce qui est incompatible avec la conduite d'un combat. + +### L'idée + +**Philip Johnston**, ingénieur civil et vétéran de la Première Guerre mondiale, avait +grandi sur la réserve navajo où son père était missionnaire. Il faisait partie du très +petit nombre de non-Navajos parlant la langue. Il propose au Corps des Marines +d'utiliser le navajo pour les transmissions. + +La langue s'y prêtait remarquablement : elle **ne s'écrivait pas**, sa grammaire et sa +tonalité la rendaient très difficile à acquérir, et on estimait alors qu'une trentaine +de personnes extérieures au peuple navajo la parlaient — aucune n'étant japonaise. + +### Ce que le code était vraiment + +C'est ici que l'idée reçue — « ils parlaient navajo à la radio » — est fausse. + +**Vingt-neuf** premières recrues navajos, engagées en mai 1942, ne se sont pas contentées +de traduire : elles ont **construit un code**, avec deux niveaux. + +1. **Un alphabet phonétique.** Chaque lettre est représentée par un mot navajo dont la + traduction anglaise commence par cette lettre. Pour transmettre `N`, on dit *tsah*, + qui signifie « aiguille » — *needle* en anglais. Le déchiffrement demande donc de + traduire le mot navajo en anglais, puis d'en garder l'initiale. +2. **Un dictionnaire de code.** Environ quatre cents termes militaires reçoivent un mot + navajo convenu, sans rapport avec leur sens. Un sous-marin devient *besh-lo*, + « poisson de fer ». Un avion de chasse, *da-he-tih-hi*, « colibri ». Un cuirassé, + *lo-tso*, « baleine ». Un destroyer, *ca-lo*, « requin ». + +Autrement dit, ce dictionnaire **est une clé**. Il a été appris par cœur, jamais emporté +au combat. + +### La parade contre l'analyse de fréquences + +Les concepteurs avaient identifié la faiblesse que vous avez exploitée en partie 1. +Si chaque lettre correspondait à un seul mot navajo, il aurait suffi de compter les +occurrences pour retrouver le `E`. + +Ils ont donc **attribué plusieurs mots aux lettres les plus fréquentes**, entre lesquels +l'opérateur alternait au hasard. L'alphabet est passé de 26 à 44 termes, enrichi +précisément sur E, T, A, O, I, N, S, H, R, D, L et U. + +C'est pourquoi votre lexique de la partie 3 contient trois mots pour la lettre A. + +### La preuve par un prisonnier + +**Joe Kieyoomia**, sergent navajo du 200e régiment d'artillerie côtière du +Nouveau-Mexique, est capturé aux Philippines en 1942 et survit à la marche de la mort de +Bataan. Les Japonais découvrent qu'il est navajo et lui font écouter les transmissions +interceptées. + +**Il ne comprend rien.** Il parle pourtant parfaitement le navajo — mais il ignorait +jusqu'à l'existence du code, et les messages, faits de mots de code convenus, ne +formaient pour lui aucun sens. Il est torturé pour ce refus supposé, forcé de rester nu +dans la neige. Il survivra à la guerre, et se trouvera à Nagasaki lors du bombardement +atomique du 9 août 1945, protégé par les murs de sa cellule. + +### Le résultat + +Le code n'a jamais été cassé. À Iwo Jima, six code talkers ont transmis plus de huit +cents messages en deux jours sans une seule erreur. Le major Howard Connor, officier +transmissions de la 5e division de Marines, déclarera : *« Sans les Navajos, +les Marines n'auraient jamais pris Iwo Jima. »* + +Le programme est resté **classifié jusqu'en 1968** : pendant vingt-trois ans, les code +talkers n'ont pas eu le droit de dire ce qu'ils avaient fait. La reconnaissance officielle +du Congrès des États-Unis n'est intervenue qu'en 2000 et 2001, alors que la plupart +étaient morts. + +Le même peuple avait, une génération plus tôt, vu ses enfants punis dans les pensionnats +fédéraux pour avoir parlé cette langue. + +**Q19.** L'histoire de Joe Kieyoomia est l'expérience décisive. Un locuteur natif, aux +mains de l'adversaire, ne peut pas lire les messages. **Qu'est-ce que cela prouve +exactement sur la source de la sécurité du système ?** + +**Q20.** Si les code talkers s'étaient contentés de parler navajo en clair, sans +dictionnaire de code, que se serait-il passé lors de la capture de Kieyoomia ? + +--- + +## Partie 5 : Le principe de Kerckhoffs + +Vous avez attaqué trois protections : + +| Fichier | Protection | Ce qui l'a fait tomber | +|---|---|---| +| 1 | un algorithme tenu secret | l'analyse de fréquences, en quelques minutes | +| 2 | un algorithme public, une clé faible | la force brute, 17 576 essais | +| 3 | une langue rare *et* un dictionnaire de code | rien — jusqu'à ce qu'on vous donne le lexique | + +**Q21.** En 1883, le cryptographe néerlandais **Auguste Kerckhoffs** énonce un principe +qui gouverne encore toute la cryptographie moderne. À partir du tableau ci-dessus, +essayez de le formuler vous-même : sur quoi la sécurité d'un système doit-elle reposer, +et sur quoi ne doit-elle **jamais** reposer ? + +**Q22.** On appelle **sécurité par l'obscurité** le fait de compter sur le secret du +fonctionnement d'un système plutôt que sur celui d'une clé. Lequel de vos trois fichiers +relevait de l'obscurité pure ? + +**Q23.** Relisez la section 3 du cours, consacrée à l'AES. Les spécifications de l'AES +sont **entièrement publiques** : n'importe qui peut lire l'algorithme, le programmer, +le tester. Le cours indique qu'à ce jour la meilleure attaque connue reste la force +brute sur 2256 clés. + +En quoi cette publicité est-elle une **force** et non une faiblesse ? Que se passerait-il +si un algorithme secret contenait un défaut ? + +**Q24.** Une entreprise vous propose son logiciel de messagerie en affirmant : +*« nos communications sont inviolables, car nous utilisons un algorithme de chiffrement +propriétaire que nous avons développé nous-mêmes et que nous ne divulguons pas. »* + +Rédigez en cinq lignes ce que vous répondez. + +**Q25.** Le troisième fichier avait une vraie clé — le dictionnaire de code — et il a +résisté. Pourtant, ce système n'aurait aucune valeur aujourd'hui. **Pourquoi ?** +*(Pensez à ce qui se passe si la clé est perdue, capturée, ou si un seul opérateur +la divulgue. Comparez avec l'AES, où changer de clé prend une seconde.)* + +--- + +## Partie 6 : L'épisode, et la série + +*Pour la culture. Rien à rendre.* + +**« Anasazi »** est le vingt-cinquième et dernier épisode de la deuxième saison de +*X-Files* (*The X-Files*), diffusé le 19 mai 1995. Il est réalisé par R. W. Goodwin, +sur une histoire de Chris Carter — le créateur de la série — et de David Duchovny, +l'interprète de l'agent Mulder. + +*X-Files* raconte l'enquête de deux agents du FBI sur des affaires non résolues : +**Fox Mulder**, convaincu de l'existence d'une dissimulation gouvernementale, et +**Dana Scully**, médecin de formation, chargée à l'origine de contrôler son travail par +la rigueur scientifique. La série a construit son identité sur cette tension entre +l'intuition et la preuve — les deux personnages ayant tour à tour raison. + +Dans l'épisode, un hacker surnommé **le Penseur** (Kenneth Soona) extrait des serveurs +du ministère de la Défense un ensemble de fichiers classifiés et les remet à Mulder sur +une bande numérique. Les fichiers sont illisibles. C'est **Scully** qui identifie la +raison : le contenu n'est pas chiffré au sens informatique, il est rédigé en **navajo**. +Un ancien du peuple navajo, **Albert Hosteen** — interprété par Floyd « Red Crow » +Westerman, acteur et musicien dakota — entreprend de les traduire. + +Le titre renvoie aux **Anasazis**, peuple du sud-ouest américain dont les cités furent +abandonnées vers le XIIIe siècle, et dont la disparition reste discutée. +Le nom, d'origine navajo, est aujourd'hui contesté : les descendants pueblos lui +préfèrent l'appellation *Ancestral Puebloans*. + +L'épisode est le premier volet d'un triptyque qui se poursuit dans la saison 3 avec +*The Blessing Way* et *Paper Clip*, et se termine sur un des cliffhangers les plus +célèbres de la série. + +**Ce que l'épisode arrange.** Vous êtes maintenant mieux informé·e que le scénario : +la série présente le navajo comme un chiffrement à lui seul, alors que le vrai système +combinait la langue **et** un dictionnaire de code appris par cœur. La nuance n'est pas +mineure — c'est précisément elle qui sépare la sécurité par l'obscurité d'une véritable +cryptographie, et c'est tout l'objet de ce TP. + +Une remarque, enfin. La série s'est emparée d'une histoire réelle, et le fait que des +lycéens français la découvrent trente ans plus tard par une série de science-fiction en +dit long sur la façon dont elle a été traitée : classifiée vingt-trois ans, reconnue +plus d'un demi-siècle après les faits. + +--- + +## Questions de réflexion + +**1.** En partie 1, l'auteur du message écarte explicitement les systèmes du ministère +*parce que* leurs spécifications sont publiques. En quoi ce raisonnement inverse-t-il +exactement le principe de Kerckhoffs ? + +**2.** La force brute de la partie 2 a demandé 17 576 essais. Combien en faudrait-il +pour une clé de 8 lettres majuscules ? Et de 12 ? *(Une machine teste environ un milliard +de clés par seconde.)* Concluez sur ce qui détermine la solidité d'une clé. + +**3.** Le chiffrement XOR est utilisé dans de vrais systèmes cryptographiques, alors même +que vous venez de le casser. Quelle condition faudrait-il respecter sur la clé pour +qu'un chiffrement XOR devienne **incassable** ? *(Cherchez « masque jetable ».)* +Pourquoi cette condition est-elle presque impossible à tenir en pratique ? + +**4.** Le dictionnaire des code talkers a été appris par cœur et jamais écrit ni emporté +au combat. En termes modernes, quel problème de sécurité cette décision résolvait-elle ? + +--- + +## Barème indicatif + +| Partie | Points | +|--------|--------| +| Partie 1 : analyse de fréquences | 6 | +| Partie 2 : XOR et force brute | 5 | +| Partie 3 : le fichier qui résiste | 3 | +| Partie 4 : lecture historique (Q19, Q20) | 2 | +| Partie 5 : principe de Kerckhoffs | 4 | +| **Total** | **20** | + +--- + +## Sources + +- *Navajo Code Talkers' Dictionary*, révision du 15 juin 1945, déclassifié sous + DoD Directive 5200.9 — [Naval History and Heritage Command](https://www.history.navy.mil/research/library/online-reading-room/title-list-alphabetically/n/code-talkers.html) +- « Semper Fidelis, Code Talkers », *Prologue*, [National Archives](https://www.archives.gov/publications/prologue/2001/winter/navajo-code-talkers.html) +- [Joe Kieyoomia](https://en.wikipedia.org/wiki/Joe_Kieyoomia) — Wikipédia +- [Anasazi (The X-Files)](https://en.wikipedia.org/wiki/Anasazi_(The_X-Files)) — Wikipédia + +--- + +Auteur : Florian Mathieu + +Licence CC BY NC + +Licence Creative Commons
Ce cours est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.