Criptografia II

O modo de usar anterior funciona bem na hora de criptografar o arquivo, você dá o nome do arquivo que quer que seja encriptado e qual o nome ele deve ter depois disso, mas na hora de descriptografar, ainda mais se for apenas em caráter temporário, é cansativo ter que descriptografar, usar o cat, e apagar novamente.

Por isso eu fiz uma modificação no código do meu programa para criptografar arquivos. Você pode usar como anteriormente, mas agora há uma opção a mais: se o arquivo de saída for “-“, ele imprimirá a string des/encriptada na tela, mais prático.

O novo source:


/* crypt:
* crypt input output
*
* Autor: André Ramaciotti da Silva
* Versão: 0.4
*
* 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.
*
* NOTAS DA VERSÃO:
* Faltam ainda modificações no que diz respeito a sobrescrever um arquivo (-f).
* Foram feitas modificações para que a saída seja impressa em “stdout” se o
* arquivo de saída for ‘-‘.
*/

#include
#include
#include
#include

#define PASSMAX 32

/* 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, int size );

/* 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[] )
{
char *encrypted = NULL;
char key[ PASSMAX+1 ];
char *string = NULL;

FILE *input = NULL;
FILE *output = NULL;

int size;

struct termios def_termios, new_termios;

if( argc != 3 )
{
fprintf( stderr, “Usage:\ncrypt inputfile outputfile\n”);
exit(EXIT_FAILURE);
}

input = xfopen( argv[1], “r” );

/* Se o arquivo de saída for “-“, não é necessário abrí-lo */
if( strcmp( argv[2], “-” ) )
{
/* Aqui usaremos fopen pois é perm. que o arquivo não exista */
output = fopen( argv[2], “r” );
if( output )
{
fprintf( stderr, “File exists: %s.\n”, argv[2]);
exit(EXIT_FAILURE);
}

output = xfopen( argv[2], “w” );
}

/* Impede o que for teclado de aparecer na tela (senha) */
tcgetattr( fileno( stdin ), &def_termios );
new_termios = def_termios;
new_termios.c_lflag &= ~ECHO;

printf(“Password: “);

if( tcsetattr( fileno( stdin ), TCSAFLUSH, &new_termios ) != 0 )
{
fprintf( stderr, “Unable to set password (termios fault).\n” );
exit(EXIT_FAILURE);
}

else
{
fgets( key, PASSMAX, stdin);
tcsetattr( fileno( stdin ), TCSANOW, &def_termios );
}

printf(“\n”);

size = filesize( input );

string = (char *) xcalloc( size, sizeof( char ) );
encrypted = (char *) xcalloc( size, sizeof( char ) );

string = get_from_file( input );

encrypted = encrypt( string, key, size );
if( strcmp( argv[2], “-” ) )
to_file( encrypted, output, size );
else
printf( “%s”, encrypted );

fclose( input );

if( strcmp( argv[2], “-” ) )
fclose( output );

exit( EXIT_SUCCESS );
}

void *xcalloc( size_t number, size_t size )
{
void *ptr = NULL;

ptr = calloc( number, size );

if( ptr == NULL )
exit( EXIT_FAILURE );

return ptr;
}

FILE *xfopen( const char *filename, const char *options )
{
FILE *file = fopen( filename, options );
if( file == NULL )
exit( EXIT_FAILURE );

return file;
}

char *encrypt( const char *text, const char *key, int size )
{
char *str = NULL;
int scount, kcount;

str = (char *) xcalloc( size, sizeof( char ) );

for( scount = 0, kcount = 0; scount < size; scount++, kcount++) { str[scount] = (text[scount] ^ key[kcount]); if( kcount == (strlen( key ) -1) ) { kcount = -1; } } str[ size ] = ''; return str; free( 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] = ''; return str; free( str ); } void to_file( const char *str, FILE *fileptr, int num ) { int i; for( i = 0; i < (num-1); i++ ) { fputc( str[i], fileptr ); } } [/sourcecode]

Publicidade

2 Respostas para “Criptografia II

  1. mia novembro 29, 2011 às 9:30 am

    ola Andre estou tentando copilar o codigo mas acusa erro ,tem como me passar o codigo certinho por email?

    obrigada

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

%d blogueiros gostam disto: