elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ¿Qué hago mal?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Qué hago mal?  (Leído 2,574 veces)
goto C

Desconectado Desconectado

Mensajes: 20


Ver Perfil
¿Qué hago mal?
« 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.


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: ¿Qué hago mal?
« Respuesta #1 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


En línea

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


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: ¿Qué hago mal?
« Respuesta #2 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
En línea

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


Desconectado Desconectado

Mensajes: 1.426



Ver Perfil WWW
Re: ¿Qué hago mal?
« Respuesta #3 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.
« Última modificación: 23 Agosto 2013, 22:16 pm por Stakewinner00 » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
.img sin .cue....que hago?
Software
Sakura85 7 11,425 Último mensaje 31 Agosto 2004, 04:21 am
por khrisjian
¿que hago mal?
Software
benissa 2 2,007 Último mensaje 7 Junio 2005, 17:17 pm
por el-brujo
que hago con LOS.... DE ONO
Electrónica
mixi 1 2,497 Último mensaje 7 Febrero 2006, 10:26 am
por Bastian
¿Qué hago mal en el uso de for?
Programación C/C++
OmarHack 4 2,485 Último mensaje 5 Abril 2013, 21:48 pm
por OmarHack
que hago con una ip.
Hacking Wireless
aaroncxs 2 8,606 Último mensaje 13 Abril 2024, 03:14 am
por gmd32
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines