Workshops to introduce secondary school students to the engineering sciences.
Note
Les exercices ci-dessous sont dérivés du cours de Marine Minier, Professeure à l’Université de Lorraine ainsi que du SEED Labs “One-Way Hash Function and MAC”, Wenliang Du, Syracuse University & Naval Postgraduate School, sous licence GNU Free Documentation License, Version 1.2.
Note
Image : EPITA PIE
Login: epita
Interface: xfce
Pour ouvrir un terminal : Win + Enter Pour ouvrir firefox : Win + d
Votre serveur (http://loicrouquette.fr:4242) est corrompu, vous devez télécharger le fichier http://loicrouquette.fr:4242/test.txt et vous assurer que le fichier est correct avant d’utiliser son contenu.
Pour vérifier que vous avez reçu le bon fichier vous pouvez utiliser une fonction de condensation. En effet, le condensat représente l’empreinte du fichier, ainsi il est possible d’identifier une fichier sans avoir à retransmettre l’intégralité des informations mais uniquement son empreinte. Comme pour les empreintes digitales, il n’est pas impossible que deux personnes (ou deux fichiers) aient la même empreinte mais la probabilité que cela arrive est faible.
Le condensat du ficher correct est :
md5: 83cbba67006bf84788592ce7a1d6357f
sha1: 0d5388e80b951e2cfd56e283be4e2f452b00f48f
sha224: 0e569b924c9ff36df1471c2e94d2245e78e4e3bd06bd790b8608e9db
sha256: 9f01dfaba6bf7aba9d6e31fda1929342918f554f1a12b3dd28ef686bf8fac618
Vérifiez que le fichier téléchargé est correct. Pour cela, il est possible d’utiliser la commande suivante :
md5sum <NOM DU FICHIER>
Vous pouvez également utiliser une des fonctions suivantes
sha1sum, sha224sum, sha256sum de
la même manière.
Aide
Pour aller plus vite vous pouvez utiliser la commande suivante :
rm -f test.txt; wget http://loicrouquette.fr:4242/test.txt; md5sum test.txt
La commande rm -f va supprimer le fichier
test.txt s’il existe. La commande
wget http://loicrouquette.fr:4242/test.txt va télécharger
le fichier sur le serveur et pour finir la commande
md5sum test.txt va calculer le condensat du fichier
téléchargé.
Vous remarquez que les empreintes du fichier sont différentes, est-ce normal ? Quel analogie pouvez vous faire avec des empreintes humaines ?
Quel est l’intérêt d’avoir des empreintes de tailles différentes ?
Aide
Aidez vous d’internet pour répondre à question suivante.
Calculez ou estimez le nombre de mots de passe possibles dans les cas suivants :
Calculez ou estimez le nombre maximal d’essais que l’on peut autoriser pour rentrer un mot de passe si on veut limiter la probabilité de succès d’une attaque directe à 2−11 et que le mot de passe est choisi suivant un des types précédents.
Calculez ou estimez le temps nécessaire pour pénétrer dans un système qui est protégé par un mot de passe de chacun des types précédents si on suppose que le système attend une seconde avant de vous redemander le mot de passe.
Il s’agit de calculer l’espérance mathématique.
Combien de caractères doit comporter votre mot de pase si vous voulez une sécurité en 280, 2100 et 2128 calculs ?
Aide
Le nombre de caractère nécessaires pour afficher un nombre N en base b est logb(N), arrondi au supérieur. Vous pouvez également utiliser la formule : logb(N) = ln(N)/ln(b).
Comment doivent être choisis les mots de passe si vous souhaitez vraiment que la complexité des attaques soit celle que vous visez ?
Comme présenté en introduction, les fonctions de condensation doivent remplir certains critaires pour être qualifiés de cryptographiques. À savoir :
Pour comprendre les propriétés des fonctions de condensat, vous verez
cette question avec MD5 et SHA256:
gedit ;Aide
Pour créer un nouveau fichier texte vous pouvez utiliser
gedit.
Les caractères sont représentés sous une forme binaire dans la machine. Pour modifier uniquement 1 bit il suffit remplacer une lettre du texte par une autre lettre dont le nombre de bit qui diffère est 1.
Par exemple : la lettre Y est représentée par le code
binaire 01011001 et la lettre X par le code
01011000.
Vous pouvez vous référer à la @tbl-ascii pour avoir la correspondance entre les caractères et les valeurs binaires.
Dans cette tâche, nous allons étudier la différence entre les deux propriétés de la fonction de condensation : la résistance à la pré-image et résistance aux collisions. Nous utiliserons la méthode de force brute pour voir combien de temps il faut pour briser chacune de ces propriétés. Étant donné que la plupart des fonctions de hachage sont très résistantes à l’attaque par force brute sur ces deux propriétés, il nous faudrait des années pour les casser à l’aide de l’attaque par force brute. Pour rendre la tâche réalisable, vous avons fourni une fonction de hachage dont la taille de la sortie est paramétrable (cf. @fig-algo). Vous pouvez télécharger cette fonction ici.
def custom_hash(message, mask):
hash = MD5(message)
# & is the boolean "AND operator"
hash = hash & mask
return hash
A custom (unsafe) hash function.
Aide
Utiliser cette suite de commandes pour télécharger et décompresser le code.
wget https://loicrouquette.fr/teaching/24-25/JMI/is_my_password_safe/hash.zip
unzip hash.zip
La fonction s’utilise comme ceci :
python3 hash "Hello" -m 0b1111
Le paramètre -m indique le nombre de bits que l’on
souhaite conservé. Plus ce nombre est petit, plus il est facile de créer
des collisions.
Utiliser cette fonction de condensat fournie pour essayer de créer des collisions.
Nous souhaitons maintenant vérifier s’il est plus facile de calculer une pré-image ou de calculer des collisions. Pour ce faire nous vous fournissons un code d’exemple.
Aide
Utilisez cette suite de commandes pour télécharger et décompresser le code.
wget https://loicrouquette.fr/teaching/24-25/JMI/is_my_password_safe/benchmark.zip
unzip benchmark.zip
La commande s’utilise comme ceci:
python3 benchmark -m 0b1111111 -l 2048
Comme pour la fonction hash, le paramètre
-m indique le nombre de bits que nous souhaitons garder
pour l’évaluation du hash, plus ce paramètre est petit et plus l’attaque
est facile. Le paramètre -l indiqe le nombre d’essais
effectués. Il sera nécessaire d’augmenter cette valeur si vous augmentez
-m.
| Letter | ASCII Code | Binary | Letter | ASCII Code | Binary |
|---|---|---|---|---|---|
| a | 097 | 01100001 | A | 065 | 01000001 |
| b | 098 | 01100010 | B | 066 | 01000010 |
| c | 099 | 01100011 | C | 067 | 01000011 |
| d | 100 | 01100100 | D | 068 | 01000100 |
| e | 101 | 01100101 | E | 069 | 01000101 |
| f | 102 | 01100110 | F | 070 | 01000110 |
| g | 103 | 01100111 | G | 071 | 01000111 |
| h | 104 | 01101000 | H | 072 | 01001000 |
| i | 105 | 01101001 | I | 073 | 01001001 |
| j | 106 | 01101010 | J | 074 | 01001010 |
| k | 107 | 01101011 | K | 075 | 01001011 |
| l | 108 | 01101100 | L | 076 | 01001100 |
| m | 109 | 01101101 | M | 077 | 01001101 |
| n | 110 | 01101110 | N | 078 | 01001110 |
| o | 111 | 01101111 | O | 079 | 01001111 |
| p | 112 | 01110000 | P | 080 | 01010000 |
| q | 113 | 01110001 | Q | 081 | 01010001 |
| r | 114 | 01110010 | R | 082 | 01010010 |
| s | 115 | 01110011 | S | 083 | 01010011 |
| t | 116 | 01110100 | T | 084 | 01010100 |
| u | 117 | 01110101 | U | 085 | 01010101 |
| v | 118 | 01110110 | V | 086 | 01010110 |
| w | 119 | 01110111 | W | 087 | 01010111 |
| x | 120 | 01111000 | X | 088 | 01011000 |
| y | 121 | 01111001 | Y | 089 | 01011001 |
| z | 122 | 01111010 | Z | 090 | 01011010 |