Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Fastolfe en 21 Marzo 2011, 22:27 pm



Título: C - Problema al descifrar
Publicado por: Fastolfe en 21 Marzo 2011, 22:27 pm
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:

Código
  1. #include <stdio.h>
  2.  
  3. #define MAXT 1000
  4. #define MAXP 20
  5.  
  6. FILE *crypt;
  7.  
  8. char texto[MAXT];
  9. char pass[MAXP];
  10. int pass2;
  11.  
  12. int makepass();
  13.  
  14. void clear(){
  15. int i = 0;
  16. for (i = 0; i < 100; i++){
  17. printf("\n");
  18. }
  19. }
  20.  
  21. int main(){
  22.  
  23. clear();
  24. printf("Pass: ");
  25. fflush(stdin);
  26. gets(pass);
  27.  
  28. makepass();
  29. int i = 0;
  30.  
  31. crypt = fopen("Encripted.txt", "r");
  32.  
  33. for (i = 0; i < MAXT; i++){
  34. texto[i] = fgetc(crypt);
  35. }
  36.  
  37. fclose(crypt);
  38. crypt = fopen("No-encripted.sh", "w+");
  39.  
  40. for (i = 0; i < MAXT; i++){
  41. texto[i] = texto[i] - pass2;
  42. }
  43.  
  44. for (i = 0; i < MAXT; i++){
  45. fprintf(crypt, "%c", texto[i]);
  46. }
  47. fclose(crypt);
  48. return 0;
  49. }
  50.  
  51. int makepass(){
  52. int i = 0;
  53. for (i = 0; i < MAXP; i++){
  54. pass2 = pass2 + i - pass[i];
  55. }
  56. return 0;
  57. }
  58.  


Título: Re: C - Problema al descifrar
Publicado por: Akai en 21 Marzo 2011, 22:51 pm
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.
Código
  1. for (i = 0; i < MAXT; i++){
  2. texto[i] = fgetc(crypt);
  3. }

comprobar si
Código
  1. 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?


Título: Re: C - Problema al descifrar
Publicado por: Fastolfe en 23 Marzo 2011, 18:29 pm
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


Título: Re: C - Problema al descifrar
Publicado por: Akai en 23 Marzo 2011, 18:57 pm
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)


Título: Re: C - Problema al descifrar
Publicado por: Fastolfe en 23 Marzo 2011, 19:04 pm
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:

Código
  1. for (i = 0; i < MAXT; i++){
  2. texto[i] = fgetc(crypt);
  3. if (texto[i] == EOF){
  4. break;
  5. }
  6. }
  7.  
  8. for (i = 0; i < MAXT; i++){
  9. if (texto[i] != EOF){
  10. texto[i] = fgetc(crypt);
  11. }
  12. }
  13.  


Título: Re: C - Problema al descifrar
Publicado por: Akai en 23 Marzo 2011, 19:38 pm
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:
Código
  1. 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.


Título: Re: C - Problema al descifrar
Publicado por: Garfield07 en 23 Marzo 2011, 20:24 pm
Código
  1. #include <stdio.h>
  2.  
  3. FILE *fp1, *fp2;
  4.  
  5. int cript (char *nocrypt, char *encrypt, int value)
  6. {
  7. char car;
  8. fp1 = fopen (nocrypt, "r+");
  9. fp2 = fopen (encrypt, "w+");
  10.  
  11. while (!feof (fp1))
  12. {
  13. car = fgetc (fp1);
  14. car += value;
  15. fputc (car, fp2);
  16. }
  17.  
  18. fclose (fp1);
  19. fclose (fp2);
  20. return 0;
  21. }
  22.  
  23. int main (int argc, char *argv [])
  24. {
  25. printf ("Krypter 0.1 : Sagrini 2011 : elhacker.net\n");
  26.  
  27. if (argc != 4)
  28. {
  29. printf ("[!!!] Use: %s <file-to-crypt> <dest-file> <pass-value>\n\n", argv [0]);
  30. return 1;
  31. }
  32. if (atoi (argv [3]) > 32 || atoi (argv [3]) < 0)
  33. {
  34. printf ("[!!!] Nice try, but Pass-Value will be a correct number (<32 && >0).\n\n");
  35. return 1;
  36. }
  37.  
  38. cript (argv [1], argv [2], atoi (argv [3]));
  39. printf ("[+] Crypt finished with no errors.\n\n");
  40. return 0;
  41. }
  42.  

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...


Título: Re: C - Problema al descifrar
Publicado por: Fastolfe en 5 Abril 2011, 16:46 pm
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!!