À (at) Thu, 29 Mar 2012 12:35:07 -0700 (PDT),
wiz.kh...@gmail.com écrivait (wrote):
> alors j'ai un problème je fais actuellement un bruteforce hash md5 et
> dans mon script j'ai fais une variable tableau qui se nomme @char qui
> contient tous les caractères... après j'ai mis une boucle et la
> j'essaie de trouver l'instruction va faire ceci :
>
> L'utilisateur entre le hash MD5
> Après le bruteforce commence sous cette forme : caractère = lehashmd5ici
>
> sa commence de "a" et sa teste tous les caractère de mon tableau
> jusqu’à que ça trouve il n'y a pas de limitations de nombre de
> caractères donc le @char dois s’incrémenter de façon a faire a puis
> "aa" puis "aaa" puis "aaaa" etc ... regarder ce que j'ai fais :
Si j'ai bien compris, vous essayez de retrouver un texte dont
l'empreinte MD5 est fournie par l'utilisateur. Et vous espérez retrouver
ce texte par force brute, c'est à dire en essayant tous les textes
possibles en commençant par les textes de plus petites longueurs.
J'espère que vous êtes conscient que, sans autre limitation, cette
recherche est vouée à l'échec. Non pas qu'elle ne donnera pas le bon
résultat (ou disons plutôt un bon résultat puisque plusieurs suites
d'octets ont la même signature), mais plutôt que vous risquez d'attendre
le résultat bien plus longtemps que la durée de votre vie, de celle de
toute votre descendance et même de celle de notre univers.
Par ailleurs, MD5 peut calculer l'empreinte de n'importe quelle suite
d'octets. Il n'y a donc pas de liste de caractères possibles à créer :
les 256 valeurs sont possibles pour chaque octet !
> #On met en place tous les caracteres
> my @char = ('a','b','c','d','e','f','g','h','i','j',
> 'k','l','m','n','o','p','q','r','s','t',
> 'u','v','w','x','y','z','A','B','C','D','E',
> 'F','G','H','I','J','K','L','M','N','O',
> 'P','Q','R','S','T','U','V','W','X','Y','Z',
> ' ','1','2','3','4','5','6','7','8','9',
> '0','`','-','=','~','!','@','#','$','%',
> '^','&','*','(',')','_','+','{','}','|',
> ':','"','<','>',);
La ligne ci-dessus pourrait s'écrire plus simplement :
my @char = ('a' .. 'z', 'A' .. 'Z', '0' .. '9',
' ','`','-','=','~','!','@','#','$',
'%','^','&','*','(',')','_','+','{','}',
'|', ':','"','<','>',);
Mais elle est inutile puisque il n'y a pas de limitation sur les
caractère (ou plutôt les octets) utilisables.
Le reste du code n'a pas grand intérêt... Ce n'est pas du Perl très
correct et ça ne fait absolument pas ce que vous souhaitez.
Je pense que vous feriez mieux de débuter par un programme plus simple
pour vous initier à Perl.
Je vous donne quand même ci-dessous un petit script qui calcule toutes
les suites d'octets possibles en commençant par une suite de longueur
nulle et qui affiche la signature MD5 de chacune de ces suites. J'ai
limité le programme au mille premières suites mais il est facile de
faire en sorte qu'il aille plus loin... J'ai essayé d'écrire le code
d'une manière assez lisible pour un débutant : il pourrait être plus
compact et plus rapide mais sans doute beaucoup moins compréhensible.
#!/usr/bin/perl
use strict;
use warnings;
use Digest::MD5 qw(md5_hex);
sub inc {
my $bin = shift;
my $pos = 0;
while ($pos < length $bin) {
my $octet = substr $bin, $pos, 1;
my $val = ord $octet;
$val++;
if ($val == 256) {
substr $bin, $pos, 1, chr(0);
$pos++;
} else {
substr $bin, $pos, 1, chr($val);
return $in;
}
}
$bin = $bin . chr(0);
return $bin;
}
my $bin = "";
foreach (1..1000) {
print md5_hex($bin), "\n";
$bin = inc($bin);
}
--
Paul Gaborit - <
http://perso.mines-albi.fr/~gaborit/>
Perl en français - <
http://perl.mines-albi.fr/>