¿Qué hago mal?

Iniciado por goto C, 23 Agosto 2013, 11:43 AM

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

goto C

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.

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

amchacon

"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:

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];
}


Empezemos:

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

char cifrar(char texto)
{
  return Encriptacion[texto-'a'];
}


Otra cosa, en el codigo has puesto:
gets(texto);

Se recomiendo usar fgets en su lugar:
http://c.conclase.net/librerias/?ansifun=fgets
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

rir3760

Otro problema es el uso de las constantes 'STX', 'VT', etc. en el bloque:
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';

Ya que su valor es "implementation defined" (depende de la implementación).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Stakewinner00

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