Chiffrement et cryptographie

Rien à voir avec la boucherie, encore que.

Dans la page précédente, on se demandait où on allait ranger le mot de passe qui permet d'ouvrir le coffre. Et la réponse n'est évidemment pas "dans le coffre" : on ne met pas la clé du coffre à l'intérieur du coffre quoique certains claquent la porte de chez eux et restent bêtement coincé à l'extérieur.

Pour résoudre ce problème, il faut connaitre le concept de hash, qui est un poil surprenant pour des cartésiens, du moins au démarrage.

Concept

Hashing, hash algorith traduit en fonction de hachage, ou le résultat s'appelle un haché mais bon, utilisez le terme anglais, vous paraitrez plus intelligent.

Une encyclopédie réduite à 512 bits, et uniques par-dessus le marché. Mazette.

C'est une fonction qui, à partir d'un document quelconque (une suite d'octets), va calculer un hash code (haché, hash value, digital fingerprint…) = une suite d'octets qui sera unique, par exemple 512 bit pour SHA-512.

😲 Unique ?
Ben oui, vu la longueur du hash code, il existe plus de combinaisons possibles que d'atomes dans l'univers, du coup on dit que c'est unique.
😕 Gromph ! Cela parait bien magique.
les algorithmes de hash ne sont pas forcément parfaits.
Il se produit parfois des "collisions" : 2 documents différents produisent le même hash code.
Ce n'est pas bien, faut alors changer d'algo.
Et c'est un processus répétable ?
Heureusement, sinon ça ne serait pas bien pratique.
Et si je change 1 seul bit dans mon document, le résultat est presque pareil ?
Surtout pas, 1 seul bit change dans le document, et le hash code sera très différent, très éloigné.
Est-ce qu'on peut remonter au document à partir du hash code ?
Tu veux dire si on peut reconstruire une encyclopédie à partir de 512 octets?
Ben non, ce n'est pas un algorithme de compression.
Le document original ne peut pas être dedans.

Voilà pour le principe du hachage.

Mot de passe

Comment on s'en sert pour les mots de passe ?
En fait, on stocke le hash code, et jamais 🤟 ô grand jamais le mot de passe en clair !
Stocker un mot de passe en clair est carrément une faute professionnelle. 😈
Comment on fait pour vérifier un mot de passe ?
L'utilisateur entre son mot de passe quand on lui demande, il est aussitôt transformé en hash code.
Et on compare au hash code stocké. Si c'est pareil, c'est que c'était le bon mot de passe.
Ah oui, mais quand même, le mot de passe transite en clair à un moment ou à un autre jusqu'à l'algorithme !
Il faut faire confiance au système, et espérer que le hash code soit calculé le plus tôt possible.
Dès le départ, dans votre machine. S'il transite sur les réseaux, ce n'est évidemment pas bon.
Mais pour stocker un mot de passe, celui qui va servir de clé de déchiffrement ?
Ah oui, là c'est plus compliqué.

Fonction de dérivation de clé

Le problème, c'est qu'il nous faut un mot de passe qui permette de déchiffrer la future clé de déchiffrement. Sauf que l'on a affaire à une entité purement software, où il n'y a pas de coffre-fort physique pour la planquer. Tout est dans un fichier !

Pas question d'écrire la clé de déchiffrement dans le fichier, du genre si le password est bon parce que j'ai vérifié son hash code stocké dans mon fichier, alors la clé est... ben non, on ne l'écrit pas dedans, il faut donner une clé pour déchiffrer. Et là, ça se mord la queue.

C'est le cas de PGP, où un volume de données est chiffré avec une master key de chiffrement. Cette master key est elle-même chiffrée dans un volume header avec une clé de chiffrement dite header key.

😣 C'est quoi cette embrouille de clé qui chiffre une clé ?
🤫 Il y a une ruse : on utilise une fonction de dérivation de clé

Par exemple PBKDF2 (Password-Based Key Derivation Function2) qui utilise une norme, PKCS #5 v2.0 de son petit nom.

On part du password, on ajoute un peu sel des octets supplémentaires qui sont choisis une fois pour toutes histoire de compliquer les choses, puis on applique une fonction de hachage ah, c'est là que ça sert un certain nombre de fois, par exemple 2000 parano un jour, parano toujours, ce qui rendra les choses très difficiles à casser. On obtient alors une clé une suite de bits imprédictibles qui sert à chiffrer le volume header où est planquée la clé de chiffrement master key.

Donc pas besoin d'une autre clé pour cacher notre password, en fait on se fiche du password, par contre il faut le fournir le bon pour pouvoir recalculer la clé.

Pour la petite histoire, quand on exécute le déchiffrement du volume header pour pécho la master key, avant de se lancer dans le déchiffrement avec une mauvaise clé, en fait on regarde si le mot "TRUE" apparait quand on déchiffre. Cela permet de continuer normalement ou de s'arrêter en disant qu'il y a eu un problème. C'est en réalité un peu plus compliqué que ça car on peut utiliser plusieurs algos de dérivation différents (pour faire suer l'attaquant). Et ça c'est pour PGP.

Résultat des courses : on ne stocke rien du password, et il n'y a pas de clé de chiffrement du volume header à planquer. Cool et rusé !