C - Problema al descifrar

Iniciado por Fastolfe, 21 Marzo 2011, 22:27 PM

0 Miembros y 1 Visitante están viendo este tema.

Fastolfe

Buenas!! Se me ha ocurrido hacer un programilla de cifrado de texto. El algoritmo no podría ser más simple, pero lo que es la cifrado funciona. Mi problema viene al descifrar, que aparentemente se hace bien, incluso puedo ver el texto original en la carpeta, pero al abrir el archivo me sale el siguiente error:

Gedit has not been able to detect the character encoding.
Please check that you are not trying to open a binary file.
Select a character encoding from the menu and try again.

Este es el código:


#include <stdio.h>

#define MAXT 1000
#define MAXP 20

FILE *crypt;

char texto[MAXT];
char pass[MAXP];
int pass2;

int makepass();

void clear(){
int i = 0;
for (i = 0; i < 100; i++){
printf("\n");
}
}

int main(){

clear();
printf("Pass: ");
fflush(stdin);
gets(pass);

makepass();
int i = 0;

crypt = fopen("Encripted.txt", "r");

for (i = 0; i < MAXT; i++){
texto[i] = fgetc(crypt);
}

fclose(crypt);
crypt = fopen("No-encripted.sh", "w+");

for (i = 0; i < MAXT; i++){
texto[i] = texto[i] - pass2;
}

for (i = 0; i < MAXT; i++){
fprintf(crypt, "%c", texto[i]);
}
fclose(crypt);
return 0;
}

int makepass(){
int i = 0;
for (i = 0; i < MAXP; i++){
pass2 = pass2 + i - pass[i];
}
return 0;
}

Akai

#1
Cuidadillo con gets y fflus(stdin), que pueden dar resultados un pelín inesperados:
http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html

Entrando con tu programa. Tengo la impresión que el problema pueda ser que no te fijas si has leído el final de fichero, y entonces eso te de problemas.
for (i = 0; i < MAXT; i++){
texto[i] = fgetc(crypt);
}


comprobar si texto[i]==EOF y si lo es, finalizar el bucle sería una solución.

Pero sigue siendo raro. Has probado a hacer un cat desde consola del fichero escrito a ver que sale?

Fastolfe

No suelo usar el gets normalmente, en este caso ha sido por comodidad más que nada. Ok, tendré cuidado con los fflush jaja.
Probaré a comprobar si ha leido el final del fichero. Gracias!

No se que es un cat xD

Akai

http://linux.die.net/man/1/cat

Concatena ficheros, pero para lo que nos interesa, es que hagas en consola:

cat fichero

si eso no muestra el fichero como toca, entonces es que tienes problemas al escribirlo (¿probable?). Si lo hace, tienes problemas con el gedit (raro)

Fastolfe

Con el cat si que me aparece el contenido del fichero correctamente.
Pero al abrir el fichero con el gedit me aparece el mismo mensaje.

He probado a cambiar el bucle de estas dos formas, pero sigue apareciendo el mensaje:


for (i = 0; i < MAXT; i++){
texto[i] = fgetc(crypt);
if (texto[i] == EOF){
break;
}
}

for (i = 0; i < MAXT; i++){
if (texto[i] != EOF){
texto[i] = fgetc(crypt);
}
}

Akai

gedit te abre bien los demás ficheros (cualquier otro fichero de texto que tengas) o también te da problemas?

Has comprobado que el fichero desde donde lees está correcto?

Además, ten cuidado con eso:texto[i] = texto[i] - pass2; no sea cosa que esté jodiendo la representación. Sobretodo si pass2 es un número superior a 90.

Cuando escribas, prueba a escribir, después de la parte cifrada, un EOF.

Por otro lado, quizá abriendo el fichero a escribir como w a secas ayude. w+ es para lectura y escritura.Esto en principio no debería ser el problema, pero por si las moscas.

Garfield07


#include <stdio.h>

FILE *fp1, *fp2;

int cript (char *nocrypt, char *encrypt, int value)
{
char car;
fp1 = fopen (nocrypt, "r+");
fp2 = fopen (encrypt, "w+");

while (!feof (fp1))
{
car = fgetc (fp1);
car += value;
fputc (car, fp2);
}

fclose (fp1);
fclose (fp2);
return 0;
}

int main (int argc, char *argv [])
{
printf ("Krypter 0.1 : Sagrini 2011 : elhacker.net\n");

if (argc != 4)
{
printf ("[!!!] Use: %s <file-to-crypt> <dest-file> <pass-value>\n\n", argv [0]);
return 1;
}
if (atoi (argv [3]) > 32 || atoi (argv [3]) < 0)
{
printf ("[!!!] Nice try, but Pass-Value will be a correct number (<32 && >0).\n\n");
return 1;
}

cript (argv [1], argv [2], atoi (argv [3]));
printf ("[+] Crypt finished with no errors.\n\n");
return 0;
}


1) No es recomendable usar variables globales si no hace falta. No te acostumbres. Tampoco es bueno usar mucho DEFINE.
2) Tu código puede simplificarse mucho. Tienes líneas de más que hacen el texto más confuso.

Tu código tiene muchísimas cosas que mejorar. Te cedo el mío (de ahora mismo ;)), ahora añádele funciones de comprobación de errores y arregla el código para que la salida sea legible; yo mismo te concederé un pin :) jeje. Si no te importa déjame algo de créditos :silbar:

PD: No, no me he puesto a pensar cómo hacer salida legible...


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

Fastolfe

Perdón por tardar tanto tiempo en responder... he tenido bastantes examenes y apenas he podido meterme unos minutos...

Akai:

El fichero está bién (supongo) porque si en lugar de escribir el texto descifrado en un fichero, lo escribo en pantalla sale perfectamente.

Creo que el que pass2 sea superior a 90 no afecta al buen funcionamiento del programa, sino a los caracteres resultantes del cifrado tan solo. El w+ no me resuelve el problema...

Sagrini:

Tomo nota de ambos consejos, procuraré pasar las variables como parametros a las funciones en lugar de declararlas globales e intentaré simplificar los códigos que haga a partir de ahora.

Probaré tu código =)

Gracias!!