GÉNÉRATION DE CHAINES DE CARACTÈRES À LA FAÇON BRUTEFORCE.

defkrie Messages postés 435 Date d'inscription vendredi 20 septembre 2002 Statut Membre Dernière intervention 20 novembre 2004 - 2 août 2003 à 14:00
cs_debhian Messages postés 25 Date d'inscription jeudi 26 décembre 2002 Statut Membre Dernière intervention 12 août 2003 - 12 août 2003 à 13:50
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/13409-generation-de-chaines-de-caracteres-a-la-facon-bruteforce

cs_debhian Messages postés 25 Date d'inscription jeudi 26 décembre 2002 Statut Membre Dernière intervention 12 août 2003
12 août 2003 à 13:50
Voila, fonction modifié avec une option en stream.
Je n'ai pas testé la différence de rapidité entre stream et no-stream, mais je pense que le faite d'eviter une autre boucle pour manipuler les chaines, sa joue sur la rapidité
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
9 août 2003 à 18:40
utiliser une base de donnée, ça risque d'être une anti-optimisation si tu veux mon avis...
defkrie Messages postés 435 Date d'inscription vendredi 20 septembre 2002 Statut Membre Dernière intervention 20 novembre 2004
9 août 2003 à 14:55
De plus kira set_time_limit n'a pas d'effet lorsque PHP fonctionne en mode safe mode . Il n'y a pas d'autre solution que de changer de mode, ou de modifier la durée maximale d'exécution dans le php.ini a part une astuce que jai trouvé grace à une fonction tres peu connue elle aussi...
defkrie Messages postés 435 Date d'inscription vendredi 20 septembre 2002 Statut Membre Dernière intervention 20 novembre 2004
9 août 2003 à 14:43
oui jai essayer des que tu depasses les milles chaines d'affilés ds une variable le code commence à perdre beaucoup de temps, le stokage ds un chicher texte au pas à pas et long et risque de te faire perdre trop de temps (jai verifié) le mieux cest d'introduire au final toute ta chaine ds un fichier texte ou d'utliser une base de donnés....
cs_debhian Messages postés 25 Date d'inscription jeudi 26 décembre 2002 Statut Membre Dernière intervention 12 août 2003
8 août 2003 à 19:11
Ouai, 11 millions de chaine sa représente 80Mo a peu pret, ayant 768Mo de ram sa pose pas problème :)

Pour les très gros calcules, une modif du code peut être fait pour que les chaines s'enregistre 1 par 1 dans un fichier, pour eviter d'être socker dans une variable.

Je modifirai le code avec une option stream pour les gros calcules, je prévoit la modif ce soir, voila :)
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
8 août 2003 à 18:58
ah bravo belle optimisation! :-)
et tu stock ça où? tu stockes tout dans la RAM du serveur jusqu'à la fin du script? :-S
cs_debhian Messages postés 25 Date d'inscription jeudi 26 décembre 2002 Statut Membre Dernière intervention 12 août 2003
8 août 2003 à 18:35
Dans des proportions plus raisonnable, j'ai fait le test sur 11 millions de chaines (26^5 lettres): 510 sec (8,5 Min) pour calculer tous sa :)

J'ai encore amélioré le code, j'ai mis un $lchaine=strlen($alphabet); éxécuté une fois dans le script, ce qui evitait 4 executions de strlen() à chaque boucle (44 millions de strlen reduis en 1 seul, c'est bien :p)
J'ai aussi supprimé une boucle qui ne servrais à rien, et du même coup j'ai supprimé $c

Result (avec 32766 chaines):
3.11340892315 sec (32766)
3.0461410284 sec (32766)
3.07260894775 sec (32766)
3.02966296673 sec (32766)
3.02385306358 sec (32766)

Suppr d'une boucle

2.82348299026 sec (32766)
2.84955191612 sec (32766)
2.91051900387 sec (32766)

Modif des strlen

1.44500100613 sec (32766)
1.492841959 sec (32766)
1.47588205338 sec (32766)
1.48326897621 sec (32766)
1.47012400627 sec (32766)
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
8 août 2003 à 18:15
prix *
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
8 août 2003 à 18:15
defkrie << tu parles peut-être de ce que debhian venait de dire, je la connaissais pas, merci.
6^62 * 6 octets = bcp de Terraoctets :-) bjr le pris de l'hébergement.
cs_debhian Messages postés 25 Date d'inscription jeudi 26 décembre 2002 Statut Membre Dernière intervention 12 août 2003
8 août 2003 à 11:58
Moi je fournis juste $chaine avec les chaines, après vous pouvez l'uttiliser comme bon vous semble ^^
Par example, un crackeur de password md5:

<?
// md5 à cracker: $md5
unset($chaine);
cracker("abcdefghijklmnopqrstuvwxyz","1","2");
for($i=0;$i<=count($chaine);$i++)
{
$nmd5=md5($chaine[$i]);
if($nmd5==$md5) {
echo "MD5 Cracké !
$chaine[$i]"; die();
}
}
?>

Ou alors, vous stockez les chaines dans une base de donné, ou un fichier, pour l'uttiliser plus tard.
cs_debhian Messages postés 25 Date d'inscription jeudi 26 décembre 2002 Statut Membre Dernière intervention 12 août 2003
8 août 2003 à 11:58
Moi je fournis juste $chaine avec les chaines, après vous pouvez l'uttiliser comme bon vous semble ^^
Par example, un crackeur de password md5:

<?
// md5 à cracker: $md5
unset($chaine);
cracker("abcdefghijklmnopqrstuvwxyz","1","2");
for($i=0;$i<=count($chaine);$i++)
{
$nmd5=md5($chaine[$i]);
if($nmd5==$md5) {
echo "MD5 Cracké !
$chaine[$i]"; die();
}
}
?>

Ou alors, vous stockez les chaines dans une base de donné, ou un fichier, pour l'uttiliser plus tard.
defkrie Messages postés 435 Date d'inscription vendredi 20 septembre 2002 Statut Membre Dernière intervention 20 novembre 2004
8 août 2003 à 11:32
cest faux Kirua tu peux depasser les 30 secondes facilemnt et avoir les informations contenus de php a partir de n'importe quel page je mettrai en ligne d'ici une semine une m'éthiode simple pour utiliser ses scripts pendant un temps fini que lon a choisi bravo à debhian...
le seul probleme cest le stockage n'ya til pas interet à mettre tes chaines dans une base...
cs_debhian Messages postés 25 Date d'inscription jeudi 26 décembre 2002 Statut Membre Dernière intervention 12 août 2003
8 août 2003 à 02:53
1. C'est pour sa que j'ai rajouter set_time_limit(0), sa permet d'avoir une execution infini de php :-)

2. je dirai que c'est surtout un petit defi personnel pour moi même
, mais aussi c'est le premier algo de ce genre en php, et puis, on peut l'uttiliser en application web, ça peut être pratique !
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
8 août 2003 à 01:49
y a un problème par rapport à ça, c que à moins d'avoir accès aux fichier config PHP, les scripts sont "killés" après 30 secondes de lancement. imagine cette hypothèse: tu as besoin des chaines alphanumériques (soit 10 chiffres + 26 lettres minuscules + 26 lettres majuscules) de 6 caractères de long (ça ne me paraît pas excessif). ça te fait donc 6^62 possibilités soit: 1,759E+48. ce nombre me semble assez élevé pr 30 secondes d'exécution :-P

au fait, tu as écris ce code ds quel bute? ds le cadre d'un site à priori je vois pas trop l'utilité :-S ça m'itnéresserait de savoir à quoi ça peut bien servir :-) (à savoir que si c pr du brute force sur un serveur distant, c à oublier directement, ça serait bien trop lent)
cs_debhian Messages postés 25 Date d'inscription jeudi 26 décembre 2002 Statut Membre Dernière intervention 12 août 2003
6 août 2003 à 03:10
Alors, j'ai suivit vos conseils, et voici les modifs que j'ai faite:
-nbrcar() virré et remplacé par strlen() defini par php.
-nbchr() ne contient plus de boucle, que un return pow();
-explcar() virré et remplacé par $variable[position];
-stockage de nbchr() de la boucle for dans une variable pour ne pas qu'elle s'execute a chaque boucle.

Resultats (sur plusieurs tests):
28561 chaines/sec pour 456976 chaines
21257.64 chaines/sec pour 531441 chaines

mes results d'avant etait de 1500 chaines/sec
Merci à vous, maintenant l'algorithme vaut quelque chose :D
cs_Romuald Messages postés 172 Date d'inscription lundi 30 avril 2001 Statut Membre Dernière intervention 6 avril 2003
6 août 2003 à 00:56
Hello

Après avoir jeté un coup d'oeil au code j'ai vu que tu pouvais faire deux améliorations pour augmenter grandement la vitesse d'execution.

1: dans nbrcar(), au lieu de faire un foreach() {...}, tu peux retourner count($arr);
2: dans brute(), pour la boucle principale, au lieu de mettre un appel de fonction dans le for, mets le résultat de cet appel dans une variable au préalable et utilise ce résultat dans la condition du for. Ça évite x appels. Exemple:
$nbchr = nbchr($nbr,$alphabet);
for ($i =0;$i < $nbchr ;$i++) {

Avec ces deux corrections ici j'ai divisié à peu pres par deux le temps d'execution ^_^
cs_debhian Messages postés 25 Date d'inscription jeudi 26 décembre 2002 Statut Membre Dernière intervention 12 août 2003
3 août 2003 à 18:17
hm, je suis con, j'ai fait une fonction nbrcar identique à strlen ...
et j'uttilise aussi une boucle for pour emuler une puissance alors que exp exite ..

Donc je vais corriger tout sa, et surment que le code sera plus rapide !
defkrie Messages postés 435 Date d'inscription vendredi 20 septembre 2002 Statut Membre Dernière intervention 20 novembre 2004
3 août 2003 à 18:01
non ya plus smple selon moi pour calculer le nombre de chaine possible avec des math :
or erreur de ma part
$alphabet;$nmin;$nmax;$nbchaine=0;
$alphabet=strln($alphabet);
while($nmax>$nmin){
$temp=exp($alphabet*log($nmax));
$nbchaine=$nbchaine+$temp
$nmax--;
}
echo"chaine";
on calcule le nombre de possiblité en fonction de la longeur et du nombre de characteres en faisant (characters)^(nombre characters) et j'utilise autre chose que pow pour fiare le puissance voir program terminale s : (characters)^(nombre characters) = exp(nbcharcs log(characteres))... voila
cs_debhian Messages postés 25 Date d'inscription jeudi 26 décembre 2002 Statut Membre Dernière intervention 12 août 2003
2 août 2003 à 14:23
Chuis partit d'une base de 1550 chaines / sec
Ma machine debite à cet vitesse (XP 2600+ / 768Mo RAM).

Pour avoir le nombre de chaines possible:
for($i=$nmin;$i<=$nmax;$i++) { $n=$n+nbchr($i,$alphabet); }
(avec toujours $nmin $nmax et $alphabet)

Sinon past ton code, chuis curieux de voir kel technique tu as uttilisé :)
defkrie Messages postés 435 Date d'inscription vendredi 20 septembre 2002 Statut Membre Dernière intervention 20 novembre 2004
2 août 2003 à 14:00
Félicitations, j'avais commencé à ecrire un code du meme style met il debite que 300 chaines par secondes cependant l'estimation est souvent fausse (tu devrait aussi afficher le nombre de chaines totale seulon les parametres)
Ps: je peux te donner une portion de code qui peut dépaser la limite en temps automatiquement
@+ et Bravo