Algorithme de cryptage de texte

Algorithme de cryptage de texte

Historique

L'histoire de la cryptologie, c'est l'histoire d'une guerre. La guerre qui oppose, depuis des siècles, ceux qui ont quelque chose à cacher (qu'ils soient militaires, scientifiques, politiciens, financiers ou même amants illégitimes) et ceux qui aimeraient bien savoir ce qu'on leur cache (les ennemis, les concurrents, les espions, les escrocs et même les maris jaloux).
Les deux camps se livrent une lutte sans merci. Dès que l'un a trouvé un nouveau moyen de coder ses messages, le second se dépêche de trouver un moyen de les décrypter. Et, jusqu'à présent, il y parvient toujours. Ce n'est qu'une question de temps et de moyens.
Cultivée depuis l'antiquité, la cryptographie (du grec kruptos, caché, et graphein, écrire) est plusieurs fois millénaire. Dans la Chine antique on utilisait déjà la stéganographie, c'est à dire l'art de dissimuler un message secret dans un texte d'aspect anodin. En Inde, le célèbre «Kàma-Sùtra» recommandait aux femmes d'apprendre - entre autres choses - l'art des écritures secrètes qui doit leur permettre de dissimuler leurs liaisons. En Mésopotamie, une autre grande civilisation de l'antiquité, on remplaçait des mots par des nombres. En Grèce, on utilisait un instrument appelé «scytale» pour mélanger les lettres d'un message...
Fondamentalement, il existe deux méthodes de cryptage, qui sont d'ailleurs toujours utilisées de nos jours. Les confusions qui mélangent l'ordre des symboles contenus dans le message et les substitutions qui remplacent un symbole par un autre. Bien sûr, sur la base de ces deux techniques, une multitude de variantes, plus ou moins complexes, plus ou moins efficaces, ont été inventées.

Les dernières nouveautés en matière de cryptologie sont les hachages. Un algorithme crée une empreinte digitale du texte. Cette empreinte n'est jamais identique (de la même manière qu'il n'existe pas deux empreintes digitales qui soient identiques), et elle est toujours de longueur égale. De plus, il est impossible (dans un laps de temps court) de retrouver le message d'origine.

Développement de l'algorithme

J'ai imaginé un algorithme synchrone qui se base sur une « substitution », puis deux « confusions ». L'intérêt d'avoir moi-même créé un algorithme, est que les programmes actuels utilisés pour les décryptages par des attaques de type brute force ou dictionnaire ne sont pas adaptées à mon algorithme. Il faudrait donc quelqu'un de suffisamment qualifié pour créer un programme spécifique qui décrypte les textes chiffrés avec mon programme.

Pour expliquer l'algorithme, je vais prendre directement un exemple. La phrase à crypter est : « abcd », et le mot de passe choisi est : « efgh ».

La première opération du programme sera de trouver les codes ascii (nombres correspondant à une lettre dans Windows), de chaque lettre du texte à crypter et du mot de passe, ce qui donne pour le texte : « 120 121 122 123 » et pour le password : « 124 125 126 127 ».

La deuxième manipulation sera d'additionner les chiffres du texte avec ceux du password, lettre après lettre (« 120 + 124 ; 121 + 125 ; 122 + 126 ; 123 +127 »), ce qui donne : « 154 156 158 160 ».

La phase trois est de reconvertir les chiffres en lettre. Si un des chiffres est plus grand que 255, on soustrait automatiquement 256 pour que le chiffre soit toujours une valeur ascii. Dans notre exemple, cela donne pour les caractères : « %&/( ». Ceci est déjà incompréhensible, mais pour une meilleure sécurité, j'ai décidé de faire une deuxième « confusion ».

Pour commencer cette deuxième « confusion », j'ai voulu utiliser un hash MD5 (voir chap 3). La première opération est de créer un hash du texte, ce qui donne dans cet exemple : « e2fc714c4727ee9395f324cd2e7f331f ».

Il faut maintenant effectuer une addition des codes ascii de chacun des caractères du hash pour obtenir un nombre : « 3298 ».

Maintenant que ce chiffre est créé, nous pouvons entrer pleinement dans la deuxième « confusion », nettement plus intéressante que la première. En faisant un deuxième mélange des caractères, il est nettement plus compliqué de retrouver les textes originaux. Le nombre que nous venons de créer va servir de clé. D'après mes calculs, ce chiffre sera compris en théorie entre 32 et 8160, mais en pratique tournera plutôt aux alentours de 3200. Nous avons donc notre nombre (3298), et il faut maintenant savoir dans quel ordre croissant ces chiffres sont ordonnés.

Après une petite boucle de vérification, on trouve qu'ils sont ordonné de cette manière : « 2143 ». Si il y a deux fois le même chiffre, le deuxième aura le numéro de place du premier plus un.

Pour mieux illustrer la suite de la « confusion », nous allons continuer avec une phrase (qui aurait donc déjà passé tout ce que j'ai expliqué avant). Cette phrase est : « le chien du voisin ».

Je crée maintenant un tableau qui va servir à cette deuxième « confusion ». Dans ce tableau, je vais mettre caractère après caractère, chaque lettre du texte. Cela donnera un tableau ressemblant à ceci (les asterix sont pour figurer les espaces) :

Clé 3 2 9 8
Numérotation 2 1 4 3
Texte l e * c
h i e n
* d u *
v o i s
i n

Le tableau rempli, je prend chaque colonne par ordre croissant des chiffres de la numérotation, et je les mets bout à bout, en mettant un espace tous les 5 caractères (une habitude en cryptologie), ce qui nous donne : « eidon lh*vi cn*s* eui ».

Explication du hachage MD5

Le MD5 est un algorithme de hash (hachage) créé par M. Ron Rivest (un des développeurs du RSA et créateur du MD4), et succédant au MD2 et MD4.

Il faut comprendre par hash une fonction complexe qui résume une chaîne alphanumérique en une simple suite de chiffres et de nombres sur 128bits (32 caractères). Cette méthode crée des hash différent pour chaque phrase, même si seulement un caractère a été modifié. Il faut savoir aussi que le MD5 est à sens unique, et qu'il ne permet pas de retrouver le message initial. Cet algorithme n'est pas considéré comme de la cryptographie vu que l'on ne peut pas retrouver le message original dans un laps de temps rapide (à part s'il fait moins de 6 caractères).

Cette « empreinte » numérique est très utile pour vérifier l'intégrité de texte, ou de fichiers lors de transfert non sécurisé. De cette manière, si quelqu'un modifiait les données pendant le transfert, le récepteur pourrait vérifier si la source est fiable ou si au contraire, la source a été modifiée.

Pourquoi utiliser cet algorithme dans mon programme ? Car du fait qu'il est irréversible, si un individu arrive à retrouver le hash qui a permis la deuxième « confusion », il ne pourra pas retrouver directement le mot de passe initial, car en cryptographie, tout repose sur le secret du password.

Une autre raison est que j'avais envie de comprendre comment fonctionne réellement le MD5. Je dois avouer que je n'ai pas encore tout saisi, que très peu de tutoriels existent en français et que la documentation en anglais n'est pas des plus claire.

Description des failles potentielles

Comme je fais un programme de cryptage, les premières questions qui se posent, sont : Quel est le niveau de fiabilité de cet algorithme ? Où sont ses faiblesses ? Puis-je m'y fier ?

Tout d'abord, il faut savoir qu'aucun système de cryptographie n'est 100% fiable : il y a toujours une faille, plus ou moins exploitable. Il faut dire aussi que la sécurité d'un cryptage ne réside pas dans le secret de l'algorithme mais dans le secret du mot de passe.

Le fait que mon algorithme soit de type synchrone (le cryptage et le décryptage s'effectuent avec la même clé), le rend vulnérable aux attaques de type brute force (voir mon tutorial sur le choix du password). La sécurité d'un cryptage fait avec mon programme réside dans le choix d'un mot de passe compliqué répondant aux normes de sécurités que je décris dans le point 6.7. Une attaque par dictionnaire (essayer tous les mots d'un dictionnaire) est aussi possible, mais comme avant, si le mot de passe répond aux normes, pas de faille de sécurité en vue.

La faille la plus dangereuse, est un intrus qui intercepte plusieurs messages cryptés avec le même mot de passe, car avec une cryptanalyse partielle, il est possible de trouver le mot de passe. Une autre possibilité, c'est que quelqu'un de très doué trouve le moyen de faire de la cryptanalyse totale, c'est-à-dire trouver le moyen de décrypter tous les messages avec un autre algorithme similaire. A mon avis, il est très peu probable que quelqu'un prenne le temps de faire cela, mais c'est envisageable.

Explication du MD5 :
Article de MadKroll (http://cybmat.free.fr/docs/secu/md5.doc)

Special greetz pour castlegirl qui m'a bcp aider !
Greetz pour toute la team de SH, et pour loco5 pour ses infos sur le MD5.

Ce document intitulé « Algorithme de cryptage de texte » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous