Bonjour a tous,
alors voila cela fait un moment que je cherche a faire un alogrithme de Brute Force généraliste, valable pour n´importe quel longueur... pour ce qui ne connaisse pas, un algorithme de Brute Force génére toutes possibilité ( pour trouver une mot de passe généralement)... moi ce qui m´interresse plus, c´est le point de vue algorithmique, de toute façon le brute force de nos jours ne sert pas a grand chose...
apres quelques temps j´ai reussi a faire un brute force numerique... je m´attaque donc a la génération de mot de passe des caracteres et c´est la que je bloque, ce qui me permet de constater que mon niveau en algorithmie n´est pas très elevé...
j´ai donc besoin d´aide, pour faire la génération de toute les possibilité avec des caracteres... voici la fonction que j´ai commencé à écrire:
[Code]// fonction de génération de possibilité " caractère minuscule"
int MinCarGen(int longueur)
{
int i, j, k; / / variable pour for
/ / génération des possibilites
for(i=0; i < 26; i++)
{
printf("%c\n", ( i+97)); / / ecriture
/ / rajoute les caracteres
for(j=1; j < longueur; j++)
{
for(k=0; k < 26; k++)
{
/ / a partir d´ici ca ne vat plus
printf("%c", ( i+97)); / / caractere courant
printf("%c", ( k+97));
printf("\n");
}
}
}
return 1;
}[/Code]
voila je suis donc bloqué, et j´aimerais que l´on m´aide un peu pour que je puisse avancé...
merci par avance...
Bob...
" La chance accorde ses faveur aux esprits avertis..."
tu ne t´en sortira pas avec une boucle comme ça, sinon il t´en faudrait autant que longueur et ça va pas.
donc ce que tu pourrait faire :
/ /Là on initialise un tableau qui contiendra le mot de passe généré
char *code;
int i;
code=new char[longueur+1];
for ( i=0;i<longueur;code[i++]=´a´);
code[i]=0;
while(code[longueur-1]<=´z´)
{
code[0]++;
i=0;
while(code[i]==´z´&&[i]!=0)
{
code[i]=´a´;
if ( i<longueur) code[++i]++;
}
cout < < code < < endl;//je sais pas utiliser printf
}
finit.
si tu comprend pas ce que ça fait demande moi.
je ne l´ai pas testé, mais je pense que ça devrait marcher
tout d´abord merci pour ton aide... alors tout d´abord, je tiens a signaler que ton code ne me génére pas correctement les mots de passe...
ensuite ton code ne fait pas exactemement ce que je veux, mais la c´est ptete moi qui me suis mal exprimé...
en fait si j´entre 3 en longueur a généré, je veux que le pogramme me génére toutes les possibilité avec aux maximum 3 caracteres:
a
. ..
z
aa
ab
ac
. ..
aaa
aab
. ..
aba
abc
. ..
tout ca jusqy´a zzz si longueur égal 3. j´ai fait le code pour la generation numerique, mais la c´est beaucoup plus compliqué... c´est pour cela que je demande de l´aide...
sinon pour info la generation des possibilité numerique pour une longeur x, je l´ai faite avec 3 boucles for et ca marche tres bien, alors je me suis dit que peut etre pour les caracteres ca marcherais pareil... mais visiblement non...
aide moi encore un peu stp
en fait si on entre un longueur 3, l´algorithme doit générer les possibilité à 1, 2 et 3 caracteres ! !!
Tiens jvais essayer de coder ça. Si je trouves je te fais part de mon code.
ok Mr Goto pas de probleme... cela fait tellement longtemps que je chercher lol
ca commence a me prendre la tete
![]()
" alors tout d´abord, je tiens a signaler que ton code ne me génére pas correctement les mots de passe... " ?
Il fait quoi ? je viens de le tester, il marche parfaitement.
si tu veux qu´il fasse toute les longueur, c´est vraiment pas compliqué mais bon, regarde, il suffit de rajoutter une boucle :
int MinCarGen(int LongueurMax)
{
char *code;
int i;
int longueur;
for ( longueur=1;longueur<=LongueurMax;longueur++)
{
code=new char[longueur+1];
for ( i=0;i<longueur;code[i++]=´a´);
code[i]=0;
while(code[longueur-1]<=´z´)
{
code[0]++;
i=0;
while(code[i]==´z´&&[i]!=0)
{
code[i]=´a´;
if ( i<longueur) code[++i]++;
}
cout < < code < < endl;
}
delete[] code;
}
}
DNOB tu veux pas mettre ton code ailleurs ( wall ou autre) paske ça file un paté là !
ben non, sinon il va disparaitre dans 3 jours.
dnob700 < < je te promet ton code me génére bien kelke caractere, mais il me génére des caractere en plus et ki ne sont pas des lettres ! !!
http://wall.cours-info.net/?id=322&numero=non
oui, en fait c´est juste l´appel à cout qui était mal fait, j´aurais du dire : cout < < *code < < endl;
mais alors il comprend pas que c´est une chaine.
donc voila une version qui marche ( j´ai juste remplacé *code par code[255] )
alors ton programme marche nickel
rien a dire et fait parfaitement ce que je veux ![]()
j´ai juste deux truc a dire:
alors tout d´abord dans ton code le stdafx n´a rien a faire ![]()
et sinon g reussi a trouver un bug ; ), en fait ton programme commence a la lettre b ( caractere apres a) et se termine à { ( caractere apres z).. voila sinon rien a signaler c nickel, merci beaucoup...
bonne prog a vous
bob
en fait pour etre plus preci sur ce caractere ´{´, il apparait lors de la derniere possibilité, par exemple:
aa{ => pour 3 caractere
a{ => pour 2 caractere
et en fait jarrive pas a le supprimer, mais sinon c du tres bon boulot, j´ai réparé le fait ke le a naparait pas o debut la cause, le code[0]++ qui doit etre a la fin et non au debut...
voila mon dernier post de ce soir juste pour donner ma version de l´algorithme, qui marche sans " bug", je dirai, donc sans l´accolade et qui genere le ´a´:
using namespace std;
int MinCarGen(int LongueurMax);
int main()
{
int a;
MinCarGen(2);
cin > > a;
return 0;
}
int MinCarGen(int LongueurMax)
{
char code[255];
int i;
int longueur;
for ( longueur=1;longueur<=LongueurMax;longueur++)
{
for ( i=0;i<longueur;code[i++]=´a´);
code[longueur]=0;
while(code[longueur-1]<=´z´)
{
i=0;
while(code[i]>´z´ && code[i+1]!=0)
{
code[i]=´a´;
code[++i]++;
}
if(code[i] ! = ´{´)
cout < < code < < endl;
code[0]++;
}
}
return 0;
}
sinon je tiens encore a remercier dnob pour son travail et l´aide qu´il a pu m´apporter...
, bonne annee et bonne prog
t´as raison pour la place de l´incrémentation.
pour le stdafx j´ai juste copier mon code depuis VC++ et c´est un header qu´il utilise pour accélérer la compilaton, mais effectivement ça ne sers à rien sinon ( surtout dans un projet comme celui là).
salut,
c´est encore moi, en ce moment j´essai de modifié ton programme pour qu´il me génére des grand et petit caractere en meme temps ( et pas qu´il fasse la distinction)... mais j´ai du mal... ptete parce que je ne comprend pas ton code a la perfection, tu pourrais pas me faire une tite version, stp, pour que je vois...
Merci par avance
bob
en gros on augmente le dernier caractère de la chaine ( ou le premier ça dépend du coté dont on regarde ! ) et quand il est trop grand on augmente le suivant.
si le suivant est trop grand aussi alors on augmente le suivant encore et ainsi de suite jusqu´à la fin de la chaine.
si le dernier caractère est trop grand alors on sort.
bon ben voila ma version modifié, c´est pas optimiser, mais ca marche:
/ / fonction de génération du dictionnaire " caractère minuscule + majuscule"
int MinMaxCarGen(char fichier[50], int LongueurMax)
{
FILE *gen; / / pointeur sur fichier à générer
char code[255]; / / tableau contenant le code
int i; / / indice tableau
int longueur; / / longueur en traitement
// ouverture fichier
if((gen = fopen(fichier, " w")) == NULL)
return 0; / / erreur
// on traite toutes les longueurs possible jusqu´a longueurmax
for ( longueur=1; longueur < = LongueurMax; longueur++)
{
// marque de fin de génération de longueur
// initialisation du premier " mot"
for ( i=0; i < longueur; code[i++] = ´A´)
code[longueur] = 0;
// on fait toute les lettres
while(code[longueur-1] < = ´z´)
{
i = 0; / / init indice
while(code[i] > ´z´ && code[i+1] ! = 0)
{
code[i] = ´A´;
code[++i]++;
}
// le dernier caractere est une { ou un [, on ne la compte pas
if((´A´ < = code[i] && code[i] < = ´Z´) || ( ´a´ < = code[i] && code[i] < = ´z´))
fprintf(gen, " %s\n", code);
code[0]++; / / caractere suivant
}
}
fclose(gen); / / ferme le fichier
return 1;
}
mais ça consiste en quoi l´algo? jcomprends pas bien...
en fait, il fait toutes les combinaisons possibles avec un jeu de caracteres... par exemple, avec le je suivant 1, 2 et 3 on peut faire:
1
2
3
11
12
13
21
22
23
111
112
113
121
122
123
131
132
133
211
212
213
221
222
223
231
232
233
311
312
313
321
322
323
331
332
333
voila ce qu´il fait ![]()