Alguém pode me dar uma mãozinha no programa que estou fazendo? É mais para aprendizado, mas seria legal se ele funcionasse 100%.
Você roda ele chamando 'crypt arquivo_de_entrada arquivo_de_saida senha' e ele criptografa usando XOR (exclusivamente ou), mas estou tendo alguns problemas. Se eu tiver o arquivo 'in' com o conteudo 'Hello world' e criptografá-lo usando a senha 'asd', ele funciona perfeitamente. Agora, se eu criptografar esse mesmo arquivo usando como senha 'hello', eu tenho problemas. Quando ele for criptografar, ele irá fazer 'e' ^ 'e', resultando num caractere nulo (imagino que seja esse o problema).
/* crypt:
* crypt input output key
*
* Autor: André Ramaciotti da Silva
*
* Esse programa abre o arquivo determinado pelo primeiro argumento (input) e
* criptografa-o usando um algoritmo que usa o operador lógico ^ (XOR) e a
* chave (key) que foi dada como terceiro argumento.
*
* O resultado é gravado no arquivo dado pelo segundo argumento (output). No
* atual estado, deve-se tomar cuidado, pois se já houver um arquivos com o
* nome do segundo argumento, este será sobrescrito.
*
* A versão atual não funciona direito quando um dos caracteres da string
* coincidir com alguma caractere da chave, gerando um caractere nulo. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* TODO: incluir algumas funções numa biblioteca estática separada. */
/* Criptografa o *text* do primeiro argumento usando a *key* do segundo e
* retorna uma string com o resultado */
char *encrypt( const char *text, const char *key );
/* Retorna uma string com todo o conteudo do arquivo *fileptr* */
char *get_from_file( FILE *fileptr );
/* Abre o arquivo *filename* com as opções *options*. Se bem sucedido, retorna
* um ponteiro para o arquivo, se não, aborta a execução do programa. */
FILE *xfopen( const char *filename, const char *options );
/* Retorna o tamanho do arquivo *fileptr* em número de caracteres */
int filesize( FILE *fileptr );
/* Salva *num* caracteres da string *str* no arquivo *fileptr*. Útil se houver
* algum caractere nulo em meio à string */
void to_file( const char *str, FILE *fileptr, int num );
/* Aloca memória usando calloc e verifica se foi bem sucedido. Se for, retorna
* o(s) ponteiros, se não for, aborta a execução do programa */
void *xcalloc( size_t number, size_t size );
/* AQUI COMEÇA O PROGRAMA */
int main( int argc, char* argv[] )
{
FILE *input = NULL;
FILE *output = NULL;
int size;
char *string = NULL;
char *key = NULL;
char *encrypted = NULL;
if( argc != 4 )
{
printf("Usage:\ncrypt inputfile outputfile key\n");
exit(1);
}
input = xfopen( argv[1], "r" ); /* "rb" também não funciona */
output = xfopen( argv[2], "w" );
size = filesize( input );
string = (char *) xcalloc( size, sizeof( char ) );
key = (char *) xcalloc( strlen( argv[3] ), sizeof( char ) );
encrypted = (char *) xcalloc( size, sizeof( char ) );
strcpy(key, argv[3] );
string = get_from_file( input );
encrypted = encrypt( string, key );
to_file( encrypted, output, size );
fclose( input );
fclose( output );
return 0;
}
void *xcalloc( size_t number, size_t size )
{
void *ptr = NULL;
ptr = calloc( number, size );
if( ptr == NULL )
abort();
return ptr;
}
FILE *xfopen( const char *filename, const char *options )
{
FILE *file = fopen( filename, options );
if( file == NULL )
abort();
return file;
}
char *encrypt( const char *text, const char *key )
{
char *str = NULL;
int scount, kcount;
str = (char *) xcalloc( strlen( text ), sizeof( char ) );
for( scount = 0, kcount = 0; scount < strlen( text );
scount++, kcount++)
{
str[scount] = (text[scount] ^ key[kcount]);
if( kcount == (strlen( key ) -1) )
{
kcount = -1;
}
}
str[ strlen( text ) ] = '\0';
return str;
}
int filesize( FILE *fileptr )
{
char c;
int count = 0;
while( c != EOF )
{
c = fgetc( fileptr );
count++;
}
rewind( fileptr );
return count;
}
char *get_from_file( FILE *fileptr )
{
int size, i;
char *str;
size = filesize( fileptr );
str = (char *) xcalloc( size, sizeof( char ) );
for( i = 0; i < size; i++ )
{
str[i] = fgetc( fileptr );
}
str[size-1] = '\0';
return str;
}
void to_file( const char *str, FILE *fileptr, int num )
{
int i;
for( i = 0; i < (num-1); i++ )
{
fputc( str[i], fileptr );
}
}