#SoH on irc.geeknode.org
Vous n'êtes pas identifié.
Salut
Hier je me suis motivé à coder un petit peu histoire d'apprendre car si on ne pratique pas on avance pas.donc voici ma source les critiques argumenté sont bienvenu
#!/usr/bin/perl
use strict;
use warnings;
use Digest::MD5;
my $file;
my @lines;
my $lg;
my $i= -1;
my $hashmd5;
my $md5;
my $digest;
my $j= 0;
my $lgmd5;
print "nom du dico\n";
$file = <STDIN>;
chomp($file);
#verification de l'existance du fichier
if( -e "$file"){
print "le fichier existe\n";
}
#Ouverture et lecture du fichier
open(DICO,$file);
@lines=<DICO>;
close(DICO);
chomp(@lines);
#Fermeture du fichier
#Nombres de mots dans le fichier
$lg = (@lines);
print "Ce fichier contient $lg mots\n";
#Entrer du hash
print "Entrez le hash md5 à trouver\n";
$hashmd5=<STDIN>;
chomp($hashmd5);
$lgmd5=length($hashmd5);
#Verification du hash
if($lgmd5 != 32)
{
print "Ce hash => $hashmd5 <= n'est pas correcte il doit contenir 32 caracteres\n";
}else{
print "Ce hash => $hashmd5 <= est correcte\n .................. \n";
#Creation des hash et comparaison avec celui entré
while($j <= $lg){
$md5 = Digest::MD5->new;
$md5->add($lines[$i]);
$digest = $md5->hexdigest;
if($digest eq $hashmd5){
print "\nOrigine du hash ===>$lines[$i]<===\n\n";
exit 0;
}else{
print "hash $i $digest\n";
}
$i++;
$j++;
}
}Dernière modification par D4rkc3n (09/04/2009 09:49:38)
Hors ligne
Attention, si cette comparaison est utilisée à des fins de sécurité, alors md5 n'est pas l'algorithme à utiliser !
Il a été démontré, et les outils ont été développé, qu'il est possible de créer un fichier md5-ment semblable à un autre.
Il est donc grand temps de se diriger vers des algorithmes encore intégres, comme SHA par exemple :]
Hors ligne
c'est basic, mais on peut remarquer quelques trucs.
Pourquoi ne pas "suber" un peu ? il y a plusieurs étapes, ca serait peut être plus clair d'en faire des fonctions.
- tu demandes de lire un fichier dictionnaire. Tu devrais plutot dans une fonction demander un chemin vers un repertoire qui contient DES dicos. Tu charges et concatène les différents dicos que l'utilisateur n'aura plus qu'a copier dans son répertoire dédié aux dicos.
- tu check la validité du hash recherché. La encore, fonction, et plus complète du coup : après avoir check la longueur, check aussi les caractères utilisés. Mets ta chaine en majuscules, c'est plus propre, et rajoute donc une regex qui va verifier sur [A-F0-9]. Simple, et tu es sûr de ton coup.
Le while qui tourne sur le nombre de mots, c'est pas très propre (question de gout sans doute). A la place, pourquoi pas un
foreach $mot_en_clair (@lines) {
ton $mot_en_clair en MD5;
ton test comparatif $MD5_mot_en_clair / $hashmd5;
}Hors ligne
Effectivement un foreach est beaucoup plus adapté et fonctionne tout aussi bien,
je me met sur le répertoire et la concaténation des dicos.
Merci
Dernière modification par D4rkc3n (10/04/2009 11:50:00)
Hors ligne
au sujet de la concatenation, ca n'a de sens que selon la strategie adoptée. En effet, on peut imaginer par exemple une facon de travailler qui consiste a posséder divers dicos complets de langues (des fichiers de plusieurs Mo, donc), ce que la plupart des gens font.
Dans ce cas la concatenation est mal adaptée, parceque ca va donner un truc énorme en mémoire et ca va couter cher en ressources pour le parsing. Ca va etre lent, au final.
Une autre facon de travailler consiste à utiliser des petits dictionnaires de mots ciblés (des users, des credentials très courants comme "admin", ce genre de choses). La ca prend du sens parcequ'on va travailler sur un seul fichier plutot que d'appeller plein de petits morceaux.
Un bon compromis serait peut être de s'adapter en fonction de la taille des fichiers présents dans le répertoire : tous ceux de moins de 100Ko, concatène dans @petits_fichiers; Les autres, laisser : il feront l'objet chacun d'une boucle open/close.
Hors ligne