Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: goto C en 23 Agosto 2013, 11:43 am



Título: ¿Qué hago mal?
Publicado por: goto C en 23 Agosto 2013, 11:43 am
Hola, creo que tengo un poco de error de concepto, pero he buscado por Google ya y no me he conseguido aclarar. Os agradecería que me dijerais que hay mal en este código, ya que no cifra correctamente.

Código:
#include<stdio.h>
#include<stdlib.h>

char cifrar(char *,int);

int main()
{
char texto[200]; //texto a cifrar
char nombre[20]; //nombre que le vamos a dar al fichero de texto en el que se va a guardar el texto cifrado
FILE *pf; //puntero de tipo FILE, necesario para manejar ficheros
int i=0;
char textoencriptado[200]; //textoencriptado es el array en el que vamos a guardar el texto cifrado

printf("            ENCRIPTADOR DE TEXTOS!!!\n\n");
printf("Introduce todo el texto a cifrar y despues Enter\n");
gets(texto);

printf("Introduce el nombre del fichero que contendra\n");
printf("el texto cifrado (se debe dar segun la forma nombre.txt)\n");
scanf("%s", &nombre);
getchar();

pf=fopen(nombre,"w");

//comprobamos que no haya errores al abrir el fichero:
if(pf==NULL)
{
printf("Error al abrir el fichero. Pulsa Enter para salir\n");
getchar();
exit(1);
}

while(texto[i]!='\0' && ferror(pf)==0) //respectivamente, mientras que no lleguemos al final del texto y no haya error
//ferror devuelve 0 cuando no hay error, por eso ponemos que tiene que ser 0
{
textoencriptado[i]=cifrar(texto,i);
printf("%c", textoencriptado[i]);
getchar();
//esto escribe caracter por caracter el texto en el fichero, se puede hacer directamente con la cadena de caracteres,
//pero como lo que queremos es cifrar, aplicamos una operacion matematica sobre cada caracter, es decir,
//convertimos el caracter a entero, aplicamos un algoritmo, y volvemos a pasar el textoencriptado resultante a caracter
fputc(textoencriptado[i],pf);
i++;
}

printf("El texto se ha cifrado correctamente!\n");

fclose(pf);

printf("Enter para salir del programa\n");
getchar();
return 0;
}

char cifrar(char *texto, int i)
{
char textoencriptado[200];

//aqui aplicamos la operacion matematica que queramos
//pero como el texto saldra cifrado, quien lo lea no podra saber en principio la operacion de encriptacion que se ha aplicado
if(texto[i]=='A') //asignamos unos valores aleatoriamente antes de ver, con los ultimos 6 else if, si el caracter a cifrar se encuentra en el rango especificado de valores,
//de esta manera, hacemos muy complicado encontrar una regla para descifrar el texto
textoencriptado[i]='.';
else if(texto[i]=='.')
textoencriptado[i]=' ';
else if(texto[i]==' ')
textoencriptado[i]='a';
else if(texto[i]=='b')
textoencriptado[i]='B';
else if(texto[i]=='e')
textoencriptado[i]='l';
else if(texto[i]=='+')
textoencriptado[i]='=';
else if(texto[i]=='?')
textoencriptado[i]='t';
else if(texto[i]=='3')
textoencriptado[i]='b';
else if(texto[i]=='9')
textoencriptado[i]='0';
else if(texto[i]=='e')
textoencriptado[i]='k';
else if(texto[i]=='n')
textoencriptado[i]='H';
else if(texto[i]=='i')
textoencriptado[i]='p';
else if(texto[i]=='Q')
textoencriptado[i]='s';
else if(texto[i]=='R')
textoencriptado[i]='x';
else if(texto[i]=='r')
textoencriptado[i]='E';
else if(texto[i]=='u')
textoencriptado[i]='0';
else if(texto[i]=='p')
textoencriptado[i]='d';
else if(texto[i]=='@')
textoencriptado[i]='Q';
else if(texto[i]=='d')
textoencriptado[i]='D';
else if(texto[i]==')')
textoencriptado[i]='I';
else if(texto[i]>='{')
textoencriptado[i]='(';
else if(texto[i]>='0' && texto[i]<=';')
textoencriptado[i]=texto[i]+'STX';
else if(texto[i]>='<' && texto[i]<='M')
textoencriptado[i]=texto[i]+'VT';
else if(texto[i]>'M' && texto[i]<='Z')
textoencriptado[i]=texto[i]+'SOH';
else if(texto[i]>=']' && texto[i]<='i')
textoencriptado[i]=texto[i]-'DC4';
else if(texto[i]<='j' && texto[i]<='u')
textoencriptado[i]=texto[i]-'ETX';

return textoencriptado[i];
}

PD: no pretendo debatir si la manera de cifrar es más o menos segura, únicamente busco saber por qué no funciona.

GRACIAS. SALUDILLOS.


Título: Re: ¿Qué hago mal?
Publicado por: amchacon en 23 Agosto 2013, 12:46 pm
"No me cifra correctamente"

Vamos a ver, hay que ser más específico xD. Que entrada has introducido, que salida te sale y que salida debería salir.

De momento, te digo que no me convence el algoritmo. Exactamente en:

Código
  1. char cifrar(char *texto, int i)
  2. {
  3. char textoencriptado[200];
  4.  
  5. //aqui aplicamos la operacion matematica que queramos
  6. //pero como el texto saldra cifrado, quien lo lea no podra saber en principio la operacion de encriptacion que se ha aplicado
  7. if(texto[i]=='A') //asignamos unos valores aleatoriamente antes de ver, con los ultimos 6 else if, si el caracter a cifrar se encuentra en el rango especificado de valores,
  8. //de esta manera, hacemos muy complicado encontrar una regla para descifrar el texto
  9. textoencriptado[i]='.';
  10. else if(texto[i]=='.')
  11. textoencriptado[i]=' ';
  12. else if(texto[i]==' ')
  13. textoencriptado[i]='a';
  14. else if(texto[i]=='b')
  15. textoencriptado[i]='B';
  16. else if(texto[i]=='e')
  17. textoencriptado[i]='l';
  18. else if(texto[i]=='+')
  19. textoencriptado[i]='=';
  20. else if(texto[i]=='?')
  21. textoencriptado[i]='t';
  22. else if(texto[i]=='3')
  23. textoencriptado[i]='b';
  24. else if(texto[i]=='9')
  25. textoencriptado[i]='0';
  26. else if(texto[i]=='e')
  27. textoencriptado[i]='k';
  28. else if(texto[i]=='n')
  29. textoencriptado[i]='H';
  30. else if(texto[i]=='i')
  31. textoencriptado[i]='p';
  32. else if(texto[i]=='Q')
  33. textoencriptado[i]='s';
  34. else if(texto[i]=='R')
  35. textoencriptado[i]='x';
  36. else if(texto[i]=='r')
  37. textoencriptado[i]='E';
  38. else if(texto[i]=='u')
  39. textoencriptado[i]='0';
  40. else if(texto[i]=='p')
  41. textoencriptado[i]='d';
  42. else if(texto[i]=='@')
  43. textoencriptado[i]='Q';
  44. else if(texto[i]=='d')
  45. textoencriptado[i]='D';
  46. else if(texto[i]==')')
  47. textoencriptado[i]='I';
  48. else if(texto[i]>='{')
  49. textoencriptado[i]='(';
  50. else if(texto[i]>='0' && texto[i]<=';')
  51. textoencriptado[i]=texto[i]+'STX';
  52. else if(texto[i]>='<' && texto[i]<='M')
  53. textoencriptado[i]=texto[i]+'VT';
  54. else if(texto[i]>'M' && texto[i]<='Z')
  55. textoencriptado[i]=texto[i]+'SOH';
  56. else if(texto[i]>=']' && texto[i]<='i')
  57. textoencriptado[i]=texto[i]-'DC4';
  58. else if(texto[i]<='j' && texto[i]<='u')
  59. textoencriptado[i]=texto[i]-'ETX';
  60.  
  61. return textoencriptado[i];
  62. }

Empezemos:

Código
  1. char textoencriptado[200];

¿Para que creas un array de 200 caracteres si luego devuelves uno?

Después has puesto una tabla de ifs muy larga y muy confusa, es muy fácil que se te escapen casos o te confundas... Yo haría un array global con las encriptaciones:
Código
  1. const char Encriptacion[28] = {'e','s','a',...};

Vas poniendo sus valores en orden alfabetico (el primer valor del array correspondera a la cifrado de la a, el segundo a la cifrado de la b...).

Y la funcion Cifrar seria algo tal que asi:

Código
  1. char cifrar(char texto)
  2. {
  3.  return Encriptacion[texto-'a'];
  4. }

Otra cosa, en el codigo has puesto:
Código
  1. gets(texto);

Se recomiendo usar fgets en su lugar:
http://c.conclase.net/librerias/?ansifun=fgets


Título: Re: ¿Qué hago mal?
Publicado por: rir3760 en 23 Agosto 2013, 17:14 pm
Otro problema es el uso de las constantes 'STX', 'VT', etc. en el bloque:
Código
  1. else if(texto[i]>='0' && texto[i]<=';')
  2.   textoencriptado[i]=texto[i]+'STX';
  3. else if(texto[i]>='<' && texto[i]<='M')
  4.   textoencriptado[i]=texto[i]+'VT';
  5. else if(texto[i]>'M' && texto[i]<='Z')
  6.   textoencriptado[i]=texto[i]+'SOH';
  7. else if(texto[i]>=']' && texto[i]<='i')
  8.   textoencriptado[i]=texto[i]-'DC4';
  9. else if(texto[i]<='j' && texto[i]<='u')
  10.   textoencriptado[i]=texto[i]-'ETX';
Ya que su valor es "implementation defined" (depende de la implementación).

Un saludo


Título: Re: ¿Qué hago mal?
Publicado por: Stakewinner00 en 23 Agosto 2013, 22:14 pm
Tantos else if... No sería mejor usar switch?

El algoritmo de cifrado es tuyo o lo cogiste de algún lado?
Si lo has cogido estaría bien saber de cual se trata para mirar como tendría que ser.