Rsa data security, inc.: an md5 recovery tool based on brute force method and dictionnaries

Soyez le premier à donner votre avis sur cette source.

Vue 22 733 fois - Téléchargée 2 560 fois

Description

Décryptage des empreintes MD5 à 565 000 passes par seconde. Exercice d'algorithmie pure pour protéger ses informations personnelles dans le cadre privé, car c'est la seule utilisation utile de ce code source.

This software uses the «RSA Data Security, Inc. MD5 Message-Digest Algorithm»

==============================
1? Pourquoi ce programme ?

Initialement, je recherchais comment implémenter le hashage MD5 sous Delphi. Je suis d'abord tombé sur le RFC 1321 en C++. Ensuite, chez PhpCs.com, en commentant un code de hashage exotique, un membre a cité un code JavaScript du JdNet. Mais étant donné que la fonction est mondialement célèbre (elle en est à sa version 5 quand même et que c'est des gros balourds du cerveau qui assurent son incassabilité), elle doit bien exister déjà sous Delphi. Bien, DelphiPage donne 2 liens. Le premier DcpCrypt propose pleins de composants pour faire du hashage (MD4, MD5, RIPE, SHA, TIGER), mais vient ensuite le lien ultime de Fichtner. C'est celui-ci qu'on va utiliser... Et puis après j'ai cherché sur CS des trucs, mais sans plus.

"Offrir" simplement le MD5 n'est pas très original. J'ai donc eu l'idée de faire un Personal Recovery Tool, mais son utilisation est mathématiquement très limitée.

==============================
2? Et c'est quoi les liens ?

Dans l'ordre:

http://www.faqs.org/rfcs/rfc1321.html
http://developpeur.journaldunet.com/tutoriel/sec/010828sec_cryptohachage.shtml
http://delphipage.free.fr/cryptage.html
http://www.cityinthesky.co.uk/delphi.html
http://www.fichtner.net/delphi/md5.delphi.phtml
http://www.phpcs.com/code.aspx?id=19322
http://www.cppfrance.com/code.aspx?ID=25243
http://www.phpcs.com/code.aspx?ID=19405
http://pajhome.org.uk/site/legal.html
...et puis y'en a d'autres sur CS.

==============================
3? C'est quoi le MD5 ?

Acronyme de "Message Digest #5". L'algorithme (breveté puis rendu public) a été créé en 1991 par Ron Rivest et deux de ses camarades (Rivest-S-A) et permet de créer des signatures. Le hashage est une technique qui permet de perdre de l'information pour en représenter son contenu: d'où le mot "empreinte". De ce fait, le hashage est irréversible sauf par méthode brutale dans la limite du raisonnable.

Voici les différentes contraintes de l'algorithme MD5 qui ont justifié ses différentes versions.
- créer une empreinte numérique de taille fixe (16 octets, 128 bits)
- idéalement impossible d'inverser la fonction de hashage
- annuler idéalement la probabilité d'obtenir la même empreinte à partir de deux messages différents
- favoriser une très grande dispersion: un petit écart entre deux messages donnera un écart important entre leurs deux empreintes

MD5 tend à être remplacé par d'autres systèmes mieux sécurisés, style SHA (plus haut niveau de chiffrement).

==============================
4? Ca sert à quoi ?

MD5 est irréversible. Donc, c'est très utile...

Faisons une analogie: les empreintes digitales humaines esseulées ne permettent pas d'identifier la personne, mais leur comparaison oui. Avec le MD5, c'est pareil.

MD5 est beaucoup utilisé en PHP pour gérer des comptes sans que les informations soient exploitables, même par l'administrateur du site (certes il peut toujours remplacer les données, mais ne peut pas connaître le contenu original), qui n'a donc aucune préconnaissance de la chaîne originale. De ce fait, aucun commerce n'est possible, et le système MD5 est suffisamment solide pour résister aux attaques.

Par extension, le MD5 permet de gérer des générateurs de clé. Mais comme toute chose, il ne faut pas se baser exclusivement sur le MD5 pour coder les informations. Bien au contraire...

==============================
5? Ca ressemble à quoi le MD5 ?

Pour répondre à cette question, voici des chaînes:

MD5('') = D41D8CD98F00B204E9800998ECF8427E
MD5('a') = 0CC175B9C0F1B6A831C399E269772661
MD5('b') = 92EB5FFEE6AE2FEC3AD71C777531578F
MD5('c') = 4A8A08F09D37B73795649038408B5F33
MD5('bateau') = B40C600C9E8B436FFB554756920C4B77
MD5('gateau') = 3F8593D58BDAB252D9005A80A1E63415
MD5('Delphifr.com est le meilleur site du monde') = D1A63FBDC03253814B04508CBD4EC868
MD5('Delphifr.com est le Meilleur site du monde') = 22D9ED0E2FD2F288B2F1E7D519257B26

Comme vous le voyez, la casse est importante.

==============================
6? En définitive, il sert à quoi ton programme ?

C'est pour tenter de retrouver des données personnelles codée en MD5. Y'a deux techniques de base:
1) utiliser des dictionnaires (5 millions de mots en 48Mo). Voir ftp://gattinger.org/wordlists/ pour télécharger les fichiers. Si vous n'avez pas ces fichiers, la fonction Dico sera désactivée.
2) utiliser la méthode brutale.

La seule manière de décoder le MD5 est de tester toutes les combinaisons. C'est le principe du hashage, à ne pas confondre avec le cryptage qui lui est réversible. C'est pour cette raison que le MD5 est considéré comme incassable, car il faut bruteforcer. Or, mathématiquement, il y a un problème sympathique.

Pour un mot de 8 lettres constitué a priori de 26 lettres en minuscules, on nécessite une attente maximale de 5 jours à raison de 550 000 passes par seconde. Pour un mot de 5 caractères parmi les 256 de la table ASCII, on a besoin de 23 jours. Avec 10 caractères, il faut 70 milliards d'années. Dans ce dernier cas, à la puissance de 460 TéraFlops des supercalculateurs IBM, il faudrait "seulement" 83 ans.

Décrypter le MD5 ne peut se faire que dans le cadre privé, car les informations codées sont déjà préconnues, ce qui n'est généralement pas le cas lorsqu'on visualise une chaîne MD5 tirée du hasard. Comme déjà expliqué, il est possible de décrypter un numéro de téléphone si seulement on sait si c'en est un. Si on ne sait pas, alors se lancer dans la table ASCII est une partie perdue d'avance. L'univers ne serait pas assez âgé...

==============================
7? Comment la MD5 Lib marche-t-elle ?

Comparer deux STRING prend du temps. On préfère donc des tableaux de BYTE car c'est plus rapide (correspond au type MD5Digest). On évite ainsi de gérer des chaînes et toutes les conversions qui vont avec (voir §9). J'ai dû rajouter 4 fonctions à la librairie d'origine.

La librairie est très bien faite.

==============================
8? Peut-on encore accélérer la vitesse d'analyse ?

Il y a 4 solutions:
1) ne pas faire s'amuser pendant que le programme travail
2) fermer toutes les applications
3) avoir un seul décodeur à la fois
4) mettre l'application en focus

Les résultats sont très modestes.

==============================
9? Dans la pratique, la vitesse est de 375 000 passes par seconde pour les IP, mais avec des chaînes, on est effectivement à 550 000. Je ne comprend pas !

La puissance maximale du programme est de 550 000 passes par seconde (correspond à la chaîne vide). Pour les IP, il faut à chaque boucle regénérer l'IP sous forme de string. En revanche, pour les chaînes, on ne fait varier qu'un caractère à la fois. On a donc simplement à faire un truc du genre STRING[Index]:=CHAR;. De ce fait, on gagne énormément en vitesse, et on est à 95% de la vitesse maximale. C'est donc une très bonne optimisation difficilement réductible.

Plus les chaînes sont longues et plus ça rame. Mais le ciblage des actions réduit significativement le temps pour recouvrer une chaîne. D'où le gain espéré...

==============================
10? Cryptage ou hashage ?

Le cryptage associe des caractères à d'autres. Trouver les clés de génération permet de décrypter: principe de clés publiques et privées. Ce cryptage là sert dans les archives DOC, RAR, ZIP, XLS, PPT...

Le hashage massacre les données de manière irréversible par des fonctions non bijectives. C'est unisens. Le hashage ne peut pas être utilisé dans des documents de bureautique.

==============================
11? Comment se protéger ?

Il faut:
- mettre des mots de passe très longs
- ne pas utiliser des mots du dictionnaire
- jouer sur la casse
- utiliser un large panel de caractères ASCII

Ca démultiplie les combinaisons.

==============================
12? Comment utiliser ce logiciel ?

Par le coté mathématique de la chose, seule une utilisation privée est possible car vous connaissez l'allure de la chaîne d'origine, style «je sais qu'il y a que des 0 et des 1», «là, y'a une majuscule»... etc, etc. Un cambrioleur (ou même un ami) ne connait rien et est démuni.

Il y a eu un challenge un jour. Je cite: «Challenge RC5 / 64 bits: Ce challenge a été emporté par Distributed.net, en septembre 2002, après 1700 jours de calcul et un réseau qui a compté plus de 300 000 ordinateurs de type "PC"»

Ca fait réfléchir. Et si vous tombez par hasard sur deux chaînes différentes ayant le même MD5, alors vous pourrez être chanceux de vous.

==============================
13? Conclusion ?

Le hashage est plus sécurisé que le cryptage. Le déhashage est une éternelle procédure à cause de la protection unisens. La sécurité est un métier, et MD5 a prouvé qu'il était utile pour vos besoins personnels.

Conclusion :


Vous pouvez toujours aller visiter http://altert.family.free.fr/

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
9
Bonjour Grandvizir,

Je voulais te signaler un petit bug que j'ai découvert récemment dans le code de cette source qui rend absolument inopérante la méthode de Brute Force lorsque l'on choisit le filtrage défini par 'All ASCII characters'.

Par exemple, si l'on tente de retrouver la chaîne '!!' à partir de son empreinte (EF9FCDB53E4E10B12BFCD5E9E78135DC), le programme s'exécute... Mais n'a aucune chance de retrouver le résultat, qui est pourtant trivial (255^2 possibilités c'est rien quand on en teste plus de 600000 par seconde !)

En fait, dans la boucle de test, ce qui se passe concrètement est qu'une fois arrivée à 255, la valeur du premier élément de 'ArrTbl' repasse à 0. Hé oui c'est un array of byte !!! Or le masque ASCII est constitué de 256 caractères (en comptant #0) donc comme la boucle ne passe à l'étude du mot comportant un caractère de plus que si cette limite est atteinte, on tourne en rond en testant toujours les mêmes chaînes constituées d’un seul et unique caractère, et la boucle est ainsi infinie !

Il suffit de modifier la déclaration de ArrTbl en :
ArrTbl : array[1..MxBuff] of word
Avec un tableau de nombres codés sur 2 octets on est tout de suite un peu plus tranquille... et ça marche mieux !

A bientôt,
Nico
Messages postés
13
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
22 novembre 2007

Bah comme tu es sur codes-sources il te faudra forcément le language pour compiler et en l'occurence tu es sur delphifr donc forcément te faut delphi ...( Je dirai même plus minimum delphi6 voire 7 c'est mieux lol )
xD
Messages postés
2
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
19 novembre 2007

salut ta source a l'air d'être super mais peux tu peux dire s'y on a besoin d'un certain programme pour compiler ta source ? Merci
Messages postés
1237
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
15
Ben non: les 9 lettres donnent 2^9 combinaisons si on considère uniquement les minuscules et majuscules. La capacité du dico est donc multipliée par 512 et non par 81 (les exposants n'étaient pas calculés dans le bon sens). Mais avec tous les caractères spéciaux dérivés, ça devient... pouf... un monument indestructible ! Jugez en avec les tableaux du dico que j'ai déjà établis.

Sinon j'ai fait une mise à jour digne de ce nom: l'historique résume tout. Mais j'aimerai revenir sur 2 points très très particuliers :
1) Dans les options du projet, si on coche la case "Construire avec les paquets", on gagne 15 000 pps.
2) Si on insère dans le projet un TTimer alors que l'option précédente n'est pas cochée, on perd 130 000 pps seulement pour la recherche des IP. Si la case est cochée, c'est comme si il n'y avait rien eu.

En reprenant et corrigeant l'expression de quelqu'un: «J'me demande quand même défois ...si [Windows] n'existait pas faudrait l'inventer pour pas s'ennuyer lol»

Maintenant, on peut donc dire qu'on décode à 565 000 passes par seconde.

Avant de conclure, jettez un coup d'oeil à la fonction "ReadableOutput" dans le code. En tentant des trucs, on finit par les adopter. L'astuce tient dans le secret des types énumérés.

Et puis, l'application peut se comporter comme une DLL. Qui sait, ça peut servir...

Et compiler le code avec C++Builder n'accélère pas le processus. Peut-être faut-il utiliser l'interface Pascal avec un générateur de MD5 en C++ ? Mais j'y crois pas trop... même c'est techniquement possible.

;)
Messages postés
1237
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
15
Dernière chose vis-à-vis du mode TIMECRITICAL. Surtout, ne perdez pas le focus de l'application au profit d'une autre !!!! Il y a peu (pas forcément pas) de chance pour que Windows la réactive. C'est un comportement tout à fait normal sous Windows et justifié dans l'aide incontournable WIN32.HLP. Boostez à la critique que si vous n'avez rien à faire d'autre.

J'améliorerai bien plus tard la méthode du dictionnaire afin de démultiplier leur capacité. En ignorant la casse, un mot de 3 lettres donne 9 combinaisons, 4 lettres fournissent 16 mots...

Les dictionnaires offrent 4'350'531 mots en minuscules pour près de 40'910'694 octets de données. Cela fait une moyenne de 9 caractères par mot. Offrant chacun 81 combinaisons en moyenne, on obtient finalement 81 fois plus de mots dans la totalité du dictionnaire, soit 352 millions de mots. Et encore, on n'a pas géré les accents.

On génère ainsi virtuellement 3,08 GigaOctets de données, correspondant à une analyse de 20 minutes à raison de 300 000 passes par seconde.

Encore une fois, j'espère ne pas avoir fait des fautes de calcul.
Afficher les 11 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.