PDA

Visualizza la versione completa : [C] Spiegazioni...


fedeg93
15-02-2008, 20:03
Salve...

girovagando per il web ho trovato questo file molto interessante...



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 512
#define VERSION_NUM "1.0.0"
#define RELEASE "BETA"
#define VERBOSE (1)
int main(int argc, char **args)
{
if(argc<=1)
{
printf("Utilizzo : %s [input] [pwd] [output]\n",args[0]);
printf("[input] = File da criptare\n");
printf("[pwd] = Chiave di cifratura\n");
printf("[output] = File criptato\n");
return 1;
}
int i=1,flag=1,buf=BUFSIZE,klen,n,complete;
long fsize;
if(!strcmp("--help",args[1])||!strcmp("-h",args[1])||!strcmp("-?",args[1]))
{
printf("***** Cripter "VERSION_NUM"\n");
printf(" -h, --help, -?\tStampa questo messaggio di aiuto\n",args[0]);
printf(" -v, --versione\tStampa la versione di Galatolo Cripter\n",args[0]);
printf(" -d, --verbose\tAttiva la funzionalità verbose\n",args[0]);
printf(" -b <size>, --bufsize <size>\tSetta la dimensine del buffer (default di sistema %d byte)\n",args[0],BUFSIZE);
return 0;
}
if(!strcmp("--version",args[i])||!strcmp("-v",args[i]))
{
printf("Autore : ****)\n");
printf("Nome dell'eseguibile : %s\n",args[0]);
printf("Versione correntemente in uso : "VERSION_NUM"\n");
printf("Tipo di release : "RELEASE"\n");
printf("Rilasciato sotto licenza GNU GPL\n");
return 0;
}
while(args[i][0]=='-'&&i<argc)
{
if(!strcmp(args[i],"-verbose")||!strcmp(args[i],"-d"))
flag|=VERBOSE;
if(!strcmp(args[i],"-bufsize")||!strcmp(args[i],"-b"))
buf=abs(atoi(args[++i]));
i++;
}
if((argc-i)<3)
{
printf("Utilizzo : %s [input] [pwd] [output]\n",args[0]);
return 1;
}
FILE *fpin,*fpout;
if((flag>>0)&01)printf(" Apertura del file `%s' in sola lettura\n",args[i]);
if((fpin=fopen(args[i++],"rb"))==NULL)
{
printf("[!]Errore nell'apertura del file `%s' input\n",args[i-1]);
return 1;
}
if((flag>>0)&01)printf(" File `%s' aperto con successo\n",args[i-1]);
fseek(fpin,0,2);
fsize=ftell(fpin);
fseek(fpin,0,0);
if((flag>>0)&01)printf("[!]Dimensione del file : %ld byte\n",fsize);
klen=strlen(args[0]);
char *key=args[0];
if((flag>>0)&01)printf("[!]La chiave `%s' è lunga %d caratteri\n",args[i],klen);
++i;
if((flag>>0)&01)printf(" Apertura del file `%s' in sola scrittura\n",args[i]);
if((fpout=fopen(args[i],"wb"))==NULL)
{
printf("[!]Errore nell'apertura del file `%s' output\n",args[i]);
return 1;
}
if((flag>>0)&01)printf(" File `%s' aperto con successo\n",args[i]);
if((flag>>0)&01)printf(" Allocazione buffer\n");
char *buffer=malloc(buf);
if((flag>>0)&01)printf("[!]Allocato buffer di %d byte\n",buf);
if((flag>>0)&01)printf(" Criptazione in corso\n");
for(;;)
{
n=fread(buffer,1,buf,fpin);
if(!n)break;
for(i=0;i<buf;i++)
buffer[i]^=key[i%klen];
fwrite(buffer,1,n,fpout);
if((flag>>0)&01)printf("%3d%% Completato ",complete=ftell(fpout)*100/fsize);
if((flag>>0)&01)
{
putchar('[');
for(i=0;i<(complete/2);i++)
putchar('=');
for(;i<50;i++)
putchar(' ');
putchar(']');Galatolo Federico (galatolo.federico@gmail.com
for(i=0;i<(50+3+16)*2;i++)
{
putchar('\b');
putchar('\0');
}

}
}
if((flag>>0)&01)printf("\n Operazione completata\n");
if((flag>>0)&01)printf(" Rilascio della memoria buffer\n");
free(buffer);
if((flag>>0)&01)printf(" Chiusura files\n");
fclose(fpin);
fclose(fpout);
return 0;
}


qualcuno mi può spiegare come funziona quel ciclo per criptare i file...

come costruire un decript???

grazie a tutti...

:ciauz:

oregon
15-02-2008, 20:11
Hai trovato in rete il codice e ci metti il tuo nome ... ?

Intanto questa non mi pare una cosa corretta ...

Comunque, difficilmente si vede un codice cosi' confuso, in parte senza senso e possibilmente (non ho fatto controlli accurati) sbagliato in parte ...

La parte che "cripta" (per modo di dire) e' questa riga

buffer[i]^=key[i%klen];

ed esegue solamente una funzione XOR tra un carattere del file e un carattere della parola chiave.

Per "decriptare", se il codice lavora correttamente, devi adottare lo stesso metodo (studia la funzione XOR per capire come). Praticamente, se esegui lo stesso codice sul file criptato, ottieni quello di partenza.

fedeg93
15-02-2008, 20:17
Ci ho messo il mio nome perchè dovevo farlo vedere a una persona...

non mi permetterei mai di rubare del lavoro agli altri... :unz: :unz: :unz:

oregon
15-02-2008, 20:23
Originariamente inviato da fedeg93
Ci ho messo il mio nome perchè dovevo farlo vedere a una persona...

non mi permetterei mai di rubare del lavoro agli altri... :unz: :unz: :unz:

Lo hai appena fatto quando lo hai mostrato con il tuo nome alla persona di cui parli .... :nonono:

fedeg93
15-02-2008, 20:28
ho messo *** al posto del nome...

comunque legalmente parlando potrei mettere il mio nome... è pubblicato sutto GNU/GPL

ma non è nella mia etica :unz: :unz: :unz:

oregon
15-02-2008, 20:41
Non credo che tu possa "ignorare" totalmente (anzi ELIMINARE ogni riferimento) l'autore anche sotto GNU/GPL ... e comunque evita di fare cose del genere ... lascia il nome dell'autore ... eventualmente dovessi fare modifiche, aggiungi il tuo indicando le modifiche fatte ...

Loading