Bruteforce-Algorithmus

S

simiD

was ist daran falsch
Code:
stdio.h
time.h
stdlib.h

char str[25];
int i = 0;
int j,k, min, max;
void brute(int len,FILE *brut){
    if(i<len){
              for(j=48;j<=122;j++){
                                  str[i]=j;
                                  i++;
                                  brute(len,brut);
                                  i--;
                                  }
              }
    else{
         fprintf(brut,"%s\n",str);
         }
};

int void(main){
    char name[] = "brute.txt";
    time_t begining;
    time_t ending;
    FILE *outputfile;
    outputfile = fopen(name,"w");
    printf("wieviele zeichen sind minimum?");
    scanf("%i",&min);
    printf("wieviele zeichen sind maximum?");
    scanf("%i",&max);
    if(min > max || min < 1 || max > 24){
           printf("ihre eingaben sin unzulässig");
           }
    else{
         time(&begining);
         for(k=min;k<=max;k++){
                               brute2(k,outputfile);
                               }
         }
         time(&ending);
         printf("das hat %d sekunden gedauert",difftime(ending,begining));
         fflush(stdin);
         getchar();
    };
er gibt mir immer nur (min=2, max = 4)
00 ..0z dannach
000 ..00z dannach
0000 ..000z
aus.
 
Ich seh keine Schleife, die die einzelnen Positionen durchgeht, die Hauptschleife bestimmt die Stellen und in Brute läuft auch nur eine Schleife, welche die letzte Stelle durchgeht..

Abgesehen davon : Benutz bitte den Code Tag, damit das n bissel übersichtlicher wird.
mffg chmee
 
Hallo,

Bitte benutzen Sie Code-Tags falls es Ihnen möglich ist.

Außerdem würde ich sagen, beschreiben sie einmal was das ganz tun soll.

So nun mal zum Code:
- Wo ist Funktion "brute2" die Aufgerufen wird?

- Sie wandeln einen 32-Bit Wert in einen 8-Bit Wert um, da können schonmal Fehler enstehen
-- Zum schreiben der Zahlen in den String (char array) würde ich sprintf benutzten.

Naja und mehr kann ich aus dem Code nicht lesen. Für mich hat er keinen Sinn.

Gruß
Anfänger
 
Ich beantworte das mal ->

1. BruteForce - Rohe Gewalt
"Passwörter" per Durchgehen aller Möglichkeiten herausfinden.
passwortlänge 2, Zeichenschatz a-z -> aa ab ac ad .. ba bb bc bd .. zx zy zz

2. brute2 ist wohl brute.
sonst "mächte" es wohl keinen Sinn.

3. Der mögliche Fehler tut primär nix zur Sache, da der Algorithmus an sich schon falsch ist

Bruteforce ist eine schicke Basis für rekursive Aufrufe.
http://www.tutorials.de/forum/java/243338-brute-force-algorithmus.html
http://www.tutorials.de/forum/php/221304-bruteforce-algorithmus.html

mfg chmee
 
thx für eure antworten

brute2 war ne andere funktion in der ich die schleife anderst geschrieben hatte, das hat dann aber überhaupt nix gemacht (kein einziger eintrag ins outfile)

ich hab in vb.net den gleichen algo geschrieben und wollte ihn jetzt in c portieren um höhere geschwindigkeiten zu erreichen (8 sec. für alle möglichen kombination bei min 2, max 3 stellen scheint mir arg lang für einen dualcore 2,1 GH)

werd jetzt erstma versuchen die schleifen neu zu verschachteln

gruß simiD
 
Randomisierte Algorithmen würde ich bei sowas eher empfehlen. Die behalten die maximale Laufzeit bei, sind aber häufig schon eher fertig.
 
ich bin verwirrt eigentlich sollte sich die for-schleife doch selbst verschachteln

Code:
void brute(int len,FILE *outfile){
     
     if(i<=len){
               for(j=48;j<123;j++){
                                   str[i]=j;
                                   i++;
                                   brute(len,outfile);
                                   i--;
                                   }
               }
     else{
          fprintf(outfile,"%s\n",str);
          }
};


/*also*/
i=0;

brute(2,outfile);
|__for(j=48;j<123;j++)/*erste schleife*/
                    str[i]=j;
                    i++;
                    brute(2,outfile);
                    |__for(j=48;j<123;j++)/*zweite schleife*/
                                        str[i]=j;
                                        i++;
                                        brute(2,outfile);
                                        |__fprintf(outfile,"%s",str)/*von hier springt er zur zweiten schleife zurück 
                                                                                       aber von dort nicht zur ersten*/
was ist nun an meiner logig falsch
 
Vielleicht weil Du für die erste und die zweite Schleife jeweils die gleiche Variable nutzt ?

Das Ergebnis der inneren Schleife nach Beendigung ist j=122, da springt doch auch die Bedingung der äußeren Schleife drauf an.

mfg chmee
 
edit:
srz logik

thx da hats gehakt
hab gez ne tmp variable eingebaut

ich weiß net wie das bei euch üblich ist soll ich euch gez noch den fertigen source posten
 
Zurück