PDA

Visualizza la versione completa : Brute Force in c


sambeck98
19-02-2014, 19:02
Salve a tutti, sono un nuovo utente del forum, ho 15 anni e sono appassionato di informatica (in particolare del ramo della sicurezza) e della programmazione. Inizio questa discussione per aver guardato ovunque, senza trovare risposta, a come creare un programma brute force in c.
Allora ci ho provato io, ecco il codice:


#include <stdio.h>
#define max 36

char v[]= {'a','b','c','d'};


int main(int argc, char *argv)
{
system("clear");

FILE *fd;

fd = fopen("/home/amministratore/Scrivania/dizionario.txt", "w");

int size;
int a;
int b;
int c;

printf("Inserisci la lunghezza massima delle parole\n\n");
scanf("%d", &size);

if(size>=1)
{
for(a = 0; a<max; a++)
printf("%c\n", v[a]);
}
if(size>=2)
{
for(b = 0; b<max; b++)
{
for(c = 0; c<max; c++)
printf("%c\n", v[a] && v[b] &&v[c]);
}
}
fclose(fd);


}

Ho deciso di fare una versione di prova con solo quattro lettere e massimo due in lunghezza (e con printf), però non capisco perchè non funziona, la compilazione passa, ma se genero un file txt è corrotto. Il problema credo che sia nell'ultima stringa:


printf("%c\n", v[a] && v[b] &&v[c]);

Però non trovo il problema. Per favore magari qualcuno mi può aiutare (pf niente c++ o altri linguaggi di programmazione, o mutazioni pertinenti del mio codice)

Grazie in anticipo a tutti

Samuele_70
19-02-2014, 19:52
ciao
Nel due cicli for leggi oltre la dimensione del vettore, arrivi a 36, mentre il vettore è di soli 4 caratteri.
Nei file si scrive con la fprintf(), in questo codice apri il file e lo chiudi senza scriverci nulla.

sambeck98
19-02-2014, 20:22
Ciao grazie per la risposta.
Si per scrivere sul file ho usato fprintf, ma per la versione di prova ho usato printf (tanto se funziona i numeri li stampa lo stesso a video, e lo avrei modificato in seguito). Per quanto riguarda il 36 non ho ben capito, ho preso lo spunto per limitare la lunghezza da un programma c++, però mi chiedo come influisce sul file corrotto.
Scusa ancora se non capisco subito, però quando faccio queste cose devo essere in chiaro su ogni passaggio.

davidinho
19-02-2014, 20:24
Guarda queste 2 parti di codice

#define max 36

char v[]= {'a','b','c','d'};

if(size>=1)
{
for(a = 0; a<max; a++)
printf("%c\n", v[a]);
}

Come vedi dopo le prime 4 iterazioni inizi a leggere oltre la dimensione dell'array v

Inoltre cerca di mettere il codice tra i tags CODE, almeno risulta più leggibile ;)

sambeck98
19-02-2014, 20:30
È vero! non ci avevo fatto caso, però il problema persiste, anche con l'fprintf aprendo il file risulta illeggibile.
Ho ricontrollato ancora tutto il codice ma non riesco a trovare l'errore.

sambeck98
25-02-2014, 21:03
Trovato, bastava creare una serie di for annidati:



#include <cstdlib>
#include <iostream>
#include <fstream>
#include <time.h>

#define max 26

using namespace std;

int n;

char v[]= {'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'};
char num[]= {'1','2','3','4','5','6','7','8','9','0'};


int main(int argc, char *argv[])
{
system("clear");

ofstream wordlist;
wordlist.open(argv[1],ios::out);

if(argv[1] == NULL)
wordlist.open("/home/amministratore/Scrivania/wordlist.txt",ios::out);

int gen_time;


cout <<"Lunghezza delle stringhe?\n\n";
cin >> n;

cout <<"Generazione in corso\n\n";
time_t time1;
time_t time2;
time1 = time(NULL);

if(n>=1)
for(int a=0; a<max; a++)
wordlist<<v[a]<<endl;
if(n>=2)
for(int a=0; a<max; a++)
for(int b=0; b<max; b++)
wordlist<<v[a]<<v[b]<<endl;
if(n>=3)
for(int a=0; a<max; a++)
for(int b=0; b<max; b++)
for(int c=0; c<max; c++)
wordlist<<v[a]<<v[b]<<v[c]<<endl;
if(n>=4)
for(int a=0; a<max; a++)
for(int b=0; b<max; b++)
for(int c=0; c<max; c++)
for(int d=0; d<max; d++)
wordlist<<v[a]<<v[b]<<v[c]<<v[d]<<endl;
if(n>=5)
for(int a=0; a<max; a++)
for(int b=0; b<max; b++)
for(int c=0; c<max; c++)
for(int d=0; d<max; d++)
for(int e=0; e<max; e++)
wordlist<<v[a]<<v[b]<<v[c]<<v[d]<<v[e]<<endl;
if(n>=6)
for(int a=0; a<max; a++)
for(int b=0; b<max; b++)
for(int c=0; c<max; c++)
for(int d=0; d<max; d++)
for(int e=0; e<max; e++)
for(int f=0; f<max; f++)
wordlist<<v[a]<<v[b]<<v[c]<<v[d]<<v[e]<<v[f]<<endl;
if(n>=7)
for(int a=0; a<max; a++)
for(int b=0; b<max; b++)
for(int c=0; c<max; c++)
for(int d=0; d<max; d++)
for(int e=0; e<max; e++)
for(int f=0; f<max; f++)
for(int g=0; g<max; g++)
wordlist<<v[a]<<v[b]<<v[c]<<v[d]<<v[e]<<v[f]<<v[g]<<endl;
if(n>=8)
for(int a=0; a<max; a++)
for(int b=0; b<max; b++)
for(int c=0; c<max; c++)
for(int d=0; d<max; d++)
for(int e=0; e<max; e++)
for(int f=0; f<max; f++)
for(int g=0; g<max; g++)
for(int h=0; h<max; h++)
wordlist<<v[a]<<v[b]<<v[c]<<v[d]<<v[e]<<v[f]<<v[g]<<v[h]<<endl;
if(n>=9)
for(int a=0; a<max; a++)
for(int b=0; b<max; b++)
for(int c=0; c<max; c++)
for(int d=0; d<max; d++)
for(int e=0; e<max; e++)
for(int f=0; f<max; f++)
for(int g=0; g<max; g++)
for(int h=0; h<max; h++)
for(int i=0; i<max; i++)
wordlist<<v[a]<<v[b]<<v[c]<<v[d]<<v[e]<<v[f]<<v[g]<<v[h]<<v[i]<<endl;
if(n>=10)
for(int a=0; a<max; a++)
for(int b=0; b<max; b++)
for(int c=0; c<max; c++)
for(int d=0; d<max; d++)
for(int e=0; e<max; e++)
for(int f=0; f<max; f++)
for(int g=0; g<max; g++)
for(int h=0; h<max; h++)
for(int i=0; i<max; i++)
for(int j=0; j<max; j++)
wordlist<<v[a]<<v[b]<<v[c]<<v[d]<<v[e]<<v[f]<<v[g]<<v[h]<<v[i]<<v[j]<<endl;

time2 = time(NULL);

gen_time = difftime(time2, time1);

cout <<"Generato in "<<gen_time<<" secondi"<<endl;

}

Però si tratta di un algoritmo troppo lento, e sto lavorando ad una versione più efficiente.
Prende in input i caratteri inseriti dall'utente,e usa la lunghezza della stringa.
Finora il codice iniziale è questo:


string lst = "";

void permut()
{
for(int size=0; size<lst.length();size++)
cout<<"prova";
}

int main(int argc, char *argv[])
{
cout<<"Brute Force Generator v1.0\n\n\n";
cout<<"Inserisci i caratteri da utilizzare\n\n>";

cin >> lst;

}

Vorrei troncare la string lst in caratteri per poterli incrementare con un for (altri consigli sono ben accetti), però non ho trovato qualcosa che fa al caso mio.

Se possibile gradirei una spiegazione di altri eventuali passaggi (non voglio che postiate tutta la soluzione, devo farcela da solo, ora vorrei solo una spiegazione sulle stringhe).
Grazie a tutti! :)

Loading