Brute Force MD5 en Delphi, c'est possible ;) - Delphi/Pascal - Programmation
Marsh Posté le 15-07-2004 à 18:50:31
Salut,
j'ai eu à faire un exposé sur les fonctions de hachage, il y a 2 ans, j'avais alors fait un prog en C pour essayer de craquer en brute force le MD5 et estimer le temps nécéssaire. Je pense qu'il répond à certaines de tes questions.
J'avais aussi vérifier certaines pseudo-collision découvertes par un américain du nom de Dobertin, qui font que si on modifie un tout petit peu les conditions initiales de l'algorithme, on peut arriver à créer 2 fichiers qui donneront le meme "digest" MD5. Ce qui fait que le MD5 a un peu perdu la cote par rapport à ses concurrents (TIGRE ou SHA).
Voila mon rapport si ca t'interesse, pdf et programme avec source. Tu pourras estimer le temps nécéssaire (tu vas rire)
http://olivkta.free.fr/esiea/crypt [...] achage.zip
Dedans, j'ai marqué le temps nécéssaire sur ma bécanne (Athlon 800). Si tu utilise le prog, sache qu'il faut le faire tourner pendant pas mal de temps pour avoir une estimation pas trop folklorique.
Sinon, pour ton erreur d'execution, l'entier qu'il te donne n'est-il pas trop grand pour etre stocké sur un integer, lors de ta conversion pour la progress bar ? Si, 1 int, c'est 4 octets, ca compte jusqu'à 4Go et pas plus.
Mais déjà, n'est il pas trop grand pour etre stocké sur un extended ? (je ne connais pas la taille des extended).
Marsh Posté le 15-07-2004 à 21:07:17
Merci je vais voir
Marsh Posté le 15-07-2004 à 23:03:36
Amokers a écrit : |
C'est pas tout à fait ça.
C'est plutôt que ce n'est pas un cryptage, et donc c'est normal qu'on ne puisse pas le décrypter.
Sinon un commentaire sur ton code : pour des questions de performances il vaut mieux utiliser la fonction Format plutôt que de faire des concaténations de chaînes (+) et des conversions avec IntToStr et compagnie.
Marsh Posté le 16-07-2004 à 00:21:08
pour gagner pas mal en vitesse tu devais enlever l'affichage et tous les appels a la vcl de ta fonction BruteForce, et la sortir te TFmain aussi.
si il te faut vraiment un affichage, utilise GetTickCount pour rafraichir maximun toutes les secondes par exemple.
Marsh Posté le 16-07-2004 à 00:26:33
5041 op. / minutes, soit 236 heures
je trouve ça "peu". je m'attendais à quelques années au bas mot. le sha 128 ou + doit être bien plus performant
Marsh Posté le 16-07-2004 à 00:59:52
oups j'avais pas lu ça :
Citation : |
Marsh Posté le 16-07-2004 à 10:03:32
gligli a écrit : et tous les appels a la vcl de ta fonction BruteForce, et la sortir te TFmain aussi. |
pourquoi ?
Marsh Posté le 16-07-2004 à 11:19:27
La VCL c'est tout sauf les fonctions de Windows (unités "windows" et "shellapi", en gros)
Donc je ne vois pas trop pourquoi on devrait se passer de la VCL
Marsh Posté le 16-07-2004 à 11:33:28
heu excuse moi antp, j'avais mal lu l'aide
Pour le pb de Format c'est résolu merci
Marsh Posté le 16-07-2004 à 12:13:49
Amokers a écrit : |
J'ai pas dit qu'il fallait le faire n'importe comment aussi
lblPossibilite.Caption := Format('Possibilitées : %d', [Possibilite]);
Regarde l'aide de "Format"
IntToStr fait l'équivalent d'un Format. Donc si t'as deux IntToStr mis ensemble avec un "+" et encore une autre chaînes... je te laisse faire le calcul
Amokers a écrit : |
Format avec un %g ... il suffit de lire l'aide
PS: pour des grands nombres entiers t'as aussi Int64, là c'est 19-20 chiffres que tu as
Marsh Posté le 16-07-2004 à 12:14:43
Je vous remercie pour votre aide,
Vous me motiver en m'aidant, et je vous en suis infiniement reconnaissant.
Actuelement, il reste :
Voir pour une optimisation maximal du code source
J' attend donc vos consseils bien sur
je veux bien enlevé l'affichage de la vcl, mais comment je c'est ce qui lui appartiens ? ensuite comment l'enlevé, tu as des exemple ?
Et comment la sortir de TFmain ?
Merci de votre aide.
Marsh Posté le 16-07-2004 à 13:25:54
ANTP Je kiff trop ta signature
Tu as trop raison
Ca fais déja 2 voiture que je télécharge et sur emule ca ram en plus !
Et puis parfois il manque des pièce du style sur la première ca à zapper 5 bits de pneu donc c cho a rouler !
Marsh Posté le 16-07-2004 à 13:36:56
pour les appels a la vcl, ce que je voulait dire c'est enlever tout ce qui est maj de l'affichage et autres ePassCrypte.Text et utiliser des variables
bon alors avec GetTickCount ca devrait donner quelquechose comme ce:
Code :
|
Marsh Posté le 16-07-2004 à 14:24:06
La VCL c'est pas juste l'affichage, ce sont toutes les fonctions de Borland en fait
Marsh Posté le 16-07-2004 à 17:16:32
non, c'est juste ce qui touche à l'affichage et aux composants graphiques
(Visual Components Library)
Marsh Posté le 16-07-2004 à 17:52:54
Ouais, juste, je me suis embrouillé dans les fichiers d'aide, et dans mon souvenir toutes ces fonctions faisaient partie de la VCL (je savais bien que ça s'appellait Visual Comp. Lib., mais il me semblait que malgré ça il n'y avait pas que des trucs visuels )
Marsh Posté le 16-07-2004 à 17:57:15
heu en fait j'ai rien dit, j'ai mis :
ProgressBar.Position := Trunc(Posbar);
lblPourcentage.Caption := Format('Pourcentage : %d %%', [Trunc(Posbar)]);
Et ca marche nikel
Marsh Posté le 16-07-2004 à 18:04:56
ProgressBar.Position := (Possibilite*100) div StrToInt(FloatToStr(NbPossibilite));
lblPourcentage.Caption := IntToStr(Possibilite*100 div StrToInt(FloatToStr(NbPossibilite)));
->
ProgressBar.Position := (Possibilite*100) div Trunc(NbPossibilite); // plus simple de tronquer le nombre que de passer par une chaîne
lblPourcentage.Caption := IntToStr(ProgressBar.Position); // pas besoin de faire 2x le calcul
Marsh Posté le 16-07-2004 à 19:50:20
je te remerci antp, j'ai mis comme tu as écris, cf le premier post, mais je ne pige plus quand utiliser la fonction Format(), tu peut me précisez dans quel cas l'utiliser stp ?
merci
PS : Tu pense que je peus faire comment pour calculer le nombre de calcul par secondes ?
merci d'avance.
Marsh Posté le 16-07-2004 à 19:53:36
Format c'est à utiliser dès que tu as plus d'un "+" ou que tu dois faire plus que convertir un numérique en chaîne.
Si tu mélanges chaînes et nombres, ou que tu dois assembler deux chaînes séparées par des espaces par exemple, tu as intérêt à utiliser Format en général.
À la limite tu peux même l'utiliser juste pour les concaténations simples et les conversions simples, dans la majorité des cas elle est plus performantes.
Pour le nombre de calculs par seconde, je ne sais pas trop là comme ça quelle serait la meilleure méthode.
Marsh Posté le 16-07-2004 à 20:07:37
Merci j'ai retenue la lecon
Mais c'est vrai que je ne vois pas du tout comment calculer le nombres d'opérations par secondes
Marsh Posté le 16-07-2004 à 20:31:16
tu peux par exemple utiliser mon if , qui est exécuté toutes les secondes.
il te suffit de sauvegarder la valeur de Possibilite, comme ca une petite soustraction te donne le le nombre de possibilités calculées pour la dernière seconde. Quelquechose comme ca:
Code :
|
Marsh Posté le 16-07-2004 à 20:56:36
Je te remerci, mais le problème c'est que une seconde c'est vraiment long
Comment je peus faire stp ?
Merci
Marsh Posté le 16-07-2004 à 21:37:35
ben réduis le temps du if (en milisecondes)
par contre remplace ca:
Possibilite-LastPossibilite
par ca:
Round(1000*(Possibilite-LastPossibilite)/(GetTickCount-LastTime))
ca permets de rendre ce calcul indépendant du temps du if (c'est une bete regle de 3)
Marsh Posté le 16-07-2004 à 23:34:39
Merci
J'update le source
En fait ca marche mais ca me trouve à peu près
4500 calculs par secondes
C'est normal ?
J'ai un processeur :
AMD Althon XP 2400+
Qui tourne à 2.16 Ghz car je l'ai Overcloaker
Avec 1024 Mo de Ram ;
(DDR PC 2700 512) + (DDR PC 3700 512)
je crois que j'ai mis 166 Mhz * 12 dans le bios il me semble, car si je met 133 * 15 ou sup il reboot je ne sais pas pourquoi.
Enfin bref, crois tu que cela soit normal qu'il fasse 4500 Calculs par secondes ?
Tu peus tester chez toi pour voir stp ?
La source ce trouve ici :
http://delphiprojets.free.fr/temp/BruteForce%20MD5.zip
Voila
Marsh Posté le 17-07-2004 à 00:31:32
Alucinant !!!!!
J'ai enlevé :
//lblPossibilite.Caption := Format('Possibilitées : %d / %g', [Possibilite, NbPossibilite]);
//edPassCrypte.Text := S;
Et il tourne a 50000 pass par minutes
C'est mieux non
Bien sur on vois rien mais bon ca va plus vite et si ca trouve ca l'affiche
Il me reste plus qu'a calculer le temps total pour toutes les combinaisons
Marsh Posté le 17-07-2004 à 00:39:21
Si à chaque passage tu modifies l'affichage, c'est sûr que ça ralentit
Marsh Posté le 17-07-2004 à 01:15:52
Ben oui je sais mais tu as une solution ?
Marsh Posté le 17-07-2004 à 11:21:06
tu rafraichis une fois par 1000 passages.
Marsh Posté le 20-07-2004 à 04:21:18
Les techniques evoquées ici sont un peu dépassées qd mm
il y a d'autre techniques bien plus rapides :
on peut par exemple calculer a l'avance tout les hash md5 et les placer dans un fichier (en se limitant par exemple a a-z 0-9 sur 8 caracteres)
le resultats tient sur qq dizaines de go genre 47.6go pour lexemple donné si dessus
par aprés avec un algo de hash correct on peut facilement trouve le pass dapres son hash
avec un bon prog on peut facilement cracker 150pass/jour
il pourrait etre egalement possible de faire resider c fameuses tables de hash chez plusieurs utlisateurs et de faire des calculs en // (systeme distribué)
bon tout ceci ne demolit pas le md5 car il y a pas mal de softs rajoutant des infos supplementaires au pass (salt) et qui ne permettent pas dutiliser cette technique
bon voila jespere que jme ferai pas ban pour avoir poster ca sachant que je nait donné aucun lien ni aucun code source c'est juste pour expliquer une technique
Marsh Posté le 20-07-2004 à 08:56:01
la technique de stocker les hash est intéressante en effet. mais j'aimerais bien que tu m'expliques comment tu arrives à 47.6 Go.
Marsh Posté le 20-07-2004 à 09:45:31
Non je ne pensse pas que tu te fasse ban pour si peu
Vu que tu participe au forum et que tu aide, et puis si le md5 aurais du être cassé il aurais été cassé depuis bien longtemps et je ne pensse pas que ce sois un newbie comme moi qui vais le casser
Marsh Posté le 20-07-2004 à 09:53:40
Faudra qu'on mexplique pourquoi vous parlez de cassez un algo de hashing. Y a rien à casser là-dedans.
Marsh Posté le 20-07-2004 à 09:55:18
casser est un bien grand mot pour un bête brute force en effet
Marsh Posté le 20-07-2004 à 09:59:32
Moi je pensais plutôt au fait que comme c'est pas réversible, y aura rien à caser. Si un type hash l'intégralité de Notre-Dame de Paris en md5, ca lui donnera exactement le même résultat qu'un mot de 128 bits maximum.
Marsh Posté le 20-07-2004 à 10:09:52
gizmo a écrit : Faudra qu'on mexplique pourquoi vous parlez de cassez un algo de hashing. Y a rien à casser là-dedans. |
De la même manière, je ne vois pas l'intérêt de stocker dans un fichier le combinaisons 'calculées' il suffit pas d'incrémenter une zone mémoire de 128 bits ?
Marsh Posté le 20-07-2004 à 10:37:47
antp a écrit : De la même manière, je ne vois pas l'intérêt de stocker dans un fichier le combinaisons 'calculées' il suffit pas d'incrémenter une zone mémoire de 128 bits ? |
tu na peut etre pas tout compris a cette technique... c linverse de la fct md5 en fait, qui permet a partir dun hash de trouver le pass correspondant mais en mettant des limites (8 char, a-z,...)
JagStang a écrit : la technique de stocker les hash est intéressante en effet. mais j'aimerais bien que tu m'expliques comment tu arrives à 47.6 Go. |
effectivement si on ce contente de stocker les hash ca risque de prendre bcp plus de place que ca :
si on prend juste a-z par exemple :
26^1 + 26^2 + 26^3 + 26^4 + 26^5 + 26^6 + 26^7 = 8353082582
la taille du hash etant de 16bytes
8353082582 * 16 / 1024 / 1024 / 1024 = 124 GB....
bon si jai du temps jexpliquerai comment c reelement stocké
Marsh Posté le 20-07-2004 à 10:41:03
red faction a écrit : tu na peut etre pas tout compris a cette technique... c linverse de la fct md5 en fait, qui permet a partir dun hash de trouver le pass correspondant mais en mettant des limites (8 char, a-z,...) |
Ha ouais, j'avais loupé un truc
Tu ne trouves pas le pass correspondant, mais un des très nombreux pass correspondant
Marsh Posté le 20-07-2004 à 10:52:47
antp a écrit : Ha ouais, j'avais loupé un truc |
peu importe...
Marsh Posté le 15-07-2004 à 18:27:28
Bonjours,
Tout d'abord, comme vous devez le savoir, Le MD5 est irréversible,
Il est calculé de façon à ce que on ne puisse le décrypter.
Une seule solution nous reste, le Brute Force.
Celui-ci consiste à tester tous les caractères possibles, en les codant bien entendu.
Donc la comparaison est simple :
Si MD5(StrBruteForce) = ChaineCryptée,
Alors on connais le pass
Voila pour ceux qui ne connaissaient pas ou qui avais des doutes.
Donc j'ai réussi à crée un petit brute force MD5,
le programme est apparement finie, mais je pensse qu'il peut être optimiser, si quelq'un d'entre vous sais comment le faire, j'accepte volontier vos méthodes.
Voici la source en question :
Je vous remercie d'avance pour vos précieux conseils.
Je rappel que cette source est la à titre informatif, et n'a aucun but
Précis.
Source disponible à cette adresse :
http://delphiprojets.free.fr/temp/BruteForce%20MD5.zip
Message édité par Amokers le 16-07-2004 à 23:39:05
---------------
En theorie la pratique est égale a la théorie, en pratique ce n'est pas le cas.