Sécurité parfaite avec le masque jetable (One Time Pad)

[Cet article est une partie de la future version du Petit Livre du Hacker]

Pour crypter un message de façon sécuritaire, il faut que le résultat final ait l’air aléatoire. Si tel n’est pas le cas, par exemple si notre algorithme ne fait qu’additionner 1 sur toutes les positions, il sera assez aisé de le découvrir en analysant le résultat. L’analyse est souvent possible, car nous pouvons nous attendre à un certain type de message initial particulier comme un texte. Si le texte est en français, tous les espaces seront cryptés avec la même valeur et comme les espaces sont fréquents, la valeur cryptée qui se répétera le plus pourra être considérée comme étant l’espace. En faisant une analyse des lettres les plus fréquentes dans cette langue, la seconde valeur la plus fréquente pourra être découverte et ainsi de suite. Bien sûr, chaque texte étant différent, il y aura de mauvaises valeurs trouvées, mais ensuite, ce sera le jeu du pendu pour découvrir le message.

Revenons à la première phrase : « pour crypter un message de façon sécuritaire, il faut que le résultat final ait l’air aléatoire ». La meilleure façon d’être aléatoire est l’utilisation d’un masque jetable. Le principe est simple : créer une clé réellement aléatoire aussi grande que le message à crypter et faire un XOR entre les deux. Étant donné que le texte de cryptage est totalement aléatoire, peu importe le message initial, le résultat sera aléatoire. Ceci est le seul moyen d’avoir une sécurité parfaite et tous les autres algorithmes qui suivront vont tenter d’être le plus sécuritaires possible.

La difficulté ici, c’est d’avoir une clé réellement aléatoire. Tous les programmeurs connaissent une méthode pour générer des nombres aléatoires dans leurs langages de programmation préférés, mais celle fournie n’est pas complètement aléatoire, mais bien pseudo-aléatoire. Ce terme signifie que la méthode de génération tente d’avoir une distribution uniforme (ne pas préférer un nombre plus qu’un autre) et d’avoir l’air aléatoire (pas simplement des nombres qui se suivent). Pourquoi ne pas avoir une méthode de génération réellement aléatoire plutôt que de faire des calculs mathématiques pour avoir juste l’air aléatoire? Parce qu’un ordinateur, c’est par définition déterministe, ce qui signifie qu’il va toujours donner le même résultat avec les mêmes paramètres donnés en entrée.

La génération de nombres aléatoires est quand même possible avec un ordinateur et tous les systèmes d’exploitation fournissent ce genre de méthodes. Pour réussir cet exploit, plusieurs données différentes vont être utilisées pour ajouter de l’entropie aux valeurs générées. Cette entropie est une foule de données qui doivent changer d’une utilisation à l’autre de l’ordinateur. Par exemple, l’heure courante peut être additionnée aux positions du curseur de la souris dans l’écran, aux positions des fichiers temporaires écris sur le disque dur et au niveau d’utilisation du CPU courant. Faire un XOR entre cette valeur et une valeur pseudo-aléatoire donnera un résultat qui n’est pas possible de déduire par une suite mathématique puisqu’elle n’est plus qu’une simple suite.

Le masque jetable est dit « jetable », car il ne faut jamais utiliser la clé générée pour crypter plus qu’un seul message, sinon il sera possible de faire de l’analyse position par position. Par exemple, si la même position sur plusieurs messages est la même valeur cryptée, cela donne comme indice que la valeur initiale à cette position est la même pour tous ces messages. Il peut sembler pratiquement impossible de faire ce genre d’analyse, mais il ne faut pas oublier que les ordinateurs sont capables de faire énormément de calculs rapidement. Il faut voir ce travail d’analyse comme un Sudoku. Ceux qui ont essayé ce jeu savent qu’avec très peu d’information, il est possible de remplir la grille par plusieurs techniques de déductions. C’est la même chose avec la cryptanalyse où chaque indice rapproche de la solution.

Pour terminer, puisque le masque jetable est le seul moyen de crypter un message avec une sécurité parfaite, pourquoi ne pas arrêter ici et ne pas se bourrer le cerveau de toutes les autres méthodes qui ne veulent que s’approcher de ce résultat? En revenant à la génération de la clé, la réponse saute aux yeux : « elle doit être aussi grande que le message à crypter ». Donc un DVD crypté aurait besoin d’un second DVD pour décrypter le premier ou utiliser moitié moins d’espace en enregistrement vidéo pour à la place avoir la moitié de l’espace gobée par la clé. Crypter un disque dur en entier lui ferait aussi perdre la moitié de sa taille utile. C’est pourquoi les autres algorithmes vont utiliser des trucs pour réussir à avoir la plus petite clé possible avec la meilleure sécurité possible.