Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Cifrado de informacion en C++

Estas en el tema de Cifrado de informacion en C++ en el foro de C/C++ en Foros del Web. Hola a todos me he inventado un pequeño programa para cifrar los datos de los archivos, en c++, quisiera que lo criticaran; y me dijeran ...
  #1 (permalink)  
Antiguo 06/02/2015, 19:32
 
Fecha de Ingreso: febrero-2014
Mensajes: 107
Antigüedad: 10 años, 8 meses
Puntos: 0
Pregunta Cifrado de informacion en C++

Hola a todos me he inventado un pequeño programa para cifrar los datos de los archivos, en c++, quisiera que lo criticaran; y me dijeran que tan inseguro o seguro es, y cuanto se demoraria alguien(hacker, profesional,experto,etc..)en descifrarlo; el programa es muy sencillo solo cambia,el valor byte por byte del archivo y lo pone en uno nuevo.(En mi caso lo he probado con imagenes, pdf entre otros).

Este es el codigo de cifrado:
Código C++:
Ver original
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. FILE *archivo,*nuevo;
  6.  
  7. int main()
  8. {
  9.     char car;
  10.     archivo=fopen("C:/Users/usuario/Desktop/imagen.jpg","rb");
  11.     nuevo=fopen("C:/Users/usuario/Desktop/prueban1.jpg","wb");
  12.     if(nuevo==NULL){
  13.         cout<<"Error al abrir el archivo nuevo\n";
  14.     }
  15.  
  16.     if(archivo==NULL){
  17.         cout<<"Error al abrir el archivo\n";
  18.     }
  19.     while(fread(&car,1,1,archivo)!=0){
  20.         car+=20;
  21.         fwrite(&car,1,1,nuevo);
  22.     }
  23.     fclose(nuevo);
  24.     fclose(archivo);
  25.    
  26.     return 0;
  27. }

y este seria el codigo de descifrado:

Código C++:
Ver original
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. FILE *archivo,*nuevo;
  6.  
  7. int main()
  8. {
  9.     char car;
  10.     archivo=fopen("C:/Users/usuario/Desktop/prueban2.jpg","wb");
  11.     nuevo=fopen("C:/Users/usuario/Desktop/prueban1.jpg","rb");
  12.  
  13.     if(nuevo==NULL){
  14.         cout<<"Error al abrir el archivo nuevo\n";
  15.     }
  16.  
  17.     if(archivo==NULL){
  18.         cout<<"Error al abrir el archivo\n";
  19.     }
  20.  
  21.     while(fread(&car,1,1,nuevo)!=0){
  22.         car-=20;
  23.         fwrite(&car,1,1,archivo);
  24.     }
  25.     fclose(nuevo);
  26.     fclose(archivo);
  27.    
  28.     return 0;
  29. }
  #2 (permalink)  
Antiguo 06/02/2015, 22:16
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Cifrado de informacion en C++

Tu código de cifrado es increíblemente sencillo de romper. Ya que todo cambio que haces es *constante*.

Tiene las rutas de los archivos hardcodeadas haciendo imposible cambiar de rutas sin tener que recompilar.

El código a pesar de ser pequeño es bastante tricky.

Probe compilarlo y no compilo si no añado stdio.

Volviendo al punto de seguridad, es muy fácil romper.
Yo puedo crear un programa que haga lo siguiente:

1. Fabricar un archivo con bytes del 0 al 255
2. Cifrarlo
3. Generar una tabla, byte -> cifrado.
4. Usar la tabla para descifrar tus mensajes.

Derribado por fuerza bruta, uno de los métodos mas simples que existe.

No te sientas mal, equipos enteros de ingenieros, matematicos y criptologos han fallado en esto. Lo importante es mejorar.

Cripto 101 es un excelente pdf para iniciar. (Solo disponible en Ingles).
  #3 (permalink)  
Antiguo 07/02/2015, 10:10
 
Fecha de Ingreso: febrero-2014
Mensajes: 107
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Cifrado de informacion en C++

Cita:
Iniciado por razpeitia Ver Mensaje
Tu código de cifrado es increíblemente sencillo de romper. Ya que todo cambio que haces es *constante*.

Tiene las rutas de los archivos hardcodeadas haciendo imposible cambiar de rutas sin tener que recompilar.

El código a pesar de ser pequeño es bastante tricky.

Probe compilarlo y no compilo si no añado stdio.

Volviendo al punto de seguridad, es muy fácil romper.
Yo puedo crear un programa que haga lo siguiente:

1. Fabricar un archivo con bytes del 0 al 255
2. Cifrarlo
3. Generar una tabla, byte -> cifrado.
4. Usar la tabla para descifrar tus mensajes.

Derribado por fuerza bruta, uno de los métodos mas simples que existe.

No te sientas mal, equipos enteros de ingenieros, matematicos y criptologos han fallado en esto. Lo importante es mejorar.

Cripto 101 es un excelente pdf para iniciar. (Solo disponible en Ingles).
Saludos razpeitia, la verdad no entendi muy bien como funciona el programa que tu dices; si me pudieras dar una pequeña explicacion; voy a leer el libro de a pocos ya que mi ingles no es muy avanzado que digamos, Saludos.
  #4 (permalink)  
Antiguo 07/02/2015, 10:58
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Cifrado de informacion en C++

Supón que yo genero el siguiente archivo. (Usare python por simplicidad).

Código Python:
Ver original
  1. with open("mensaje.txt", 'wb') as f:
  2.     f.write(''.join(chr(i) for i in range(256)))

Tiene los bytes del 0 al 255 escritos en ese orden.

Si yo encripto ese archivo con tu programa y obtengo el archivo "mensaje_encriptado.txt". Con ese archivo yo puedo generar una tabla, para descriptar todos los demás mensajes que tenga.

Código Python:
Ver original
  1. with open("mensaje_encriptado.txt", 'rb') as f:
  2.     keys = f.read()
  3.     values = ''.join(chr(i) for i in range(256))
  4.     table = dict(zip(keys, values))

Supón que encriptas otro mensaje, "mensage2_encriptado.txt" yo no necesito ninguna clave, contraseña, ni tu programa para desencriptar.

Código Python:
Ver original
  1. # Continuacion del programa de arriba
  2. with open("mensage2_encriptado.txt", 'rb') as f:
  3.     data = f.read()
  4.  
  5. print ''.join(table[c] for c in data)

Esto es porque si yo se que si pongo 'e' y tu programa regresa 'x', y siempre que pongo 'e' regresa 'x' puedo asumir que 'e' -> 'x' y viceversa 'e' <- 'x'.
  #5 (permalink)  
Antiguo 07/02/2015, 21:51
 
Fecha de Ingreso: febrero-2014
Mensajes: 107
Antigüedad: 10 años, 8 meses
Puntos: 0
Pregunta Respuesta: Cifrado de informacion en C++

Cita:
Iniciado por razpeitia Ver Mensaje
Supón que yo genero el siguiente archivo. (Usare python por simplicidad).

Código Python:
Ver original
  1. with open("mensaje.txt", 'wb') as f:
  2.     f.write(''.join(chr(i) for i in range(256)))

Tiene los bytes del 0 al 255 escritos en ese orden.

Si yo encripto ese archivo con tu programa y obtengo el archivo "mensaje_encriptado.txt". Con ese archivo yo puedo generar una tabla, para descriptar todos los demás mensajes que tenga.

Código Python:
Ver original
  1. with open("mensaje_encriptado.txt", 'rb') as f:
  2.     keys = f.read()
  3.     values = ''.join(chr(i) for i in range(256))
  4.     table = dict(zip(keys, values))

Supón que encriptas otro mensaje, "mensage2_encriptado.txt" yo no necesito ninguna clave, contraseña, ni tu programa para desencriptar.

Código Python:
Ver original
  1. # Continuacion del programa de arriba
  2. with open("mensage2_encriptado.txt", 'rb') as f:
  3.     data = f.read()
  4.  
  5. print ''.join(table[c] for c in data)

Esto es porque si yo se que si pongo 'e' y tu programa regresa 'x', y siempre que pongo 'e' regresa 'x' puedo asumir que 'e' -> 'x' y viceversa 'e' <- 'x'.
Mmm ya te entendi lo que me quieres decir; pero digamos por ejemplo que el cifrado responde a una clave "xxx" y que por ejemplo el algoritmo obedeciera de forma, que a los bytes pares se le sumara la longitud de la clave en este caso 3 bytes de tamaño, para cada byte par que contenga el archivo se le sume 3 a su valor; si el cifrado obedeciera a una clave por lo menos seria un poco mas dificil descifrarla, no?, suponiendo en este caso el segundo byte='a' y el tercer byte tambien es= 'a', pero solo al segundo le sumaria 3 en este caso quedaria 'd', de tal forma que 'd'-->'a' y 'a'-->'a'.....????
  #6 (permalink)  
Antiguo 08/02/2015, 06:54
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Cifrado de informacion en C++

Cita:
Iniciado por shikamarucb Ver Mensaje
Mmm ya te entendi lo que me quieres decir; pero digamos por ejemplo que el cifrado responde a una clave "xxx" y que por ejemplo el algoritmo obedeciera de forma, que a los bytes pares se le sumara la longitud de la clave en este caso 3 bytes de tamaño, para cada byte par que contenga el archivo se le sume 3 a su valor; si el cifrado obedeciera a una clave por lo menos seria un poco mas dificil descifrarla, no?, suponiendo en este caso el segundo byte='a' y el tercer byte tambien es= 'a', pero solo al segundo le sumaria 3 en este caso quedaria 'd', de tal forma que 'd'-->'a' y 'a'-->'a'.....????
Seria ligeramente un poco mas difícil. Pero básicamente puedo aplicar el mismo concepto que aplique anteriormente para obtener n tablas donde n es la longuitud de tu clave.

Incluso para sacar la longuitud de clave seria bastante sencillo.

El mismo escenario pero con xor en lugar de sumas te lo muestra en crypto 101.

Etiquetas: cifrado, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:30.