Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: i-node en 1 Mayo 2016, 20:01 pm



Título: Problema criptograma
Publicado por: i-node en 1 Mayo 2016, 20:01 pm
Hola,

Tengo el siguiente enunciado, pero como no tengo ni idea de criptografia ni tampoco mucho de matematicas, la verdad.. No se como realizar el segundo programa. El primero ya esta hecho y os lo pongo aqui.

Gracias.

Una empresa desea transmitir datos via telefonica, pero le preocupa que sus telefonos pudieran ser intervenidos. Todos los datos se transmiten como enteros de cuatro digitos. La empresa le ha pedido que escriba un programa que encripte los datos para que puiedan transmitirlos de manera mas segura. Su programa debe leer un entero de cuatro digitos y encriptarlo de la siguiente manera: reemplace cada digito por (la suma de ese digito mas 7) modulo 10. Despues intercambie el primer digito con el tercero, intercambie el segundo con el cuarto, y despliegue el entero cifrado. Escriba un programa separado que ingrese el entero de cuatro digitos cifrado, y lo desencripte para formar el numero original.

Código:
#include <iostream>

using std::cout;
using std::cin;

int main() {
const int tamano = 4;
int numero = 0;
int numeroTmp[tamano];
int cont = tamano -1;

while(numero < 1000 || numero > 9999) {
cout << "Introduce el mensaje de 4 digitos: ";
cin >> numero;
}

while(numero != 0) {
numeroTmp[cont] = ((numero % 10) + 7) % 10; // Separamos los digitos, sumamos 7 y hacemos modulo 10, colocandolos del derecho
numero = numero / 10;
cont--;
}

numero = numeroTmp[0]; // Comienza el intercambio del primer digito con el tercero
numeroTmp[0] = numeroTmp[2];
numeroTmp[2] = numero;

numero = numeroTmp[1]; // Comienza el intercambio del segundo digito con el cuarto
numeroTmp[1] = numeroTmp[3];
numeroTmp[3] = numero;

cout << "El numero cifrado es: ";

for(int i= 0; i<tamano; i++) // Desplegamos numero cifrado
cout << numeroTmp[i];

cout << "\n";

return 0;
}


Título: Re: Problema criptograma
Publicado por: HardForo en 1 Mayo 2016, 20:41 pm
No veo funciones, necesitas dos una ida y otra de vuelta


Título: Re: Problema criptograma
Publicado por: i-node en 1 Mayo 2016, 20:49 pm
No veo funciones, necesitas dos una ida y otra de vuelta

Se podria hacer con funciones, desde luego. Pero no es necesario. El ejercicio pide dos programas, el primero ya esta hecho. Y puedo hacer el segundo, siempre y cuando sepa que es lo que debe hacer para calcular el numero de vuelta partiendo de el numero cifrado.


Título: Re: Problema criptograma
Publicado por: MAFUS en 1 Mayo 2016, 21:59 pm
Yo lo he sacado con papel y boli  ;D

Pero bueno: aquí va una pista... dos pistas en una sola idea:

1 => 8
5 => 2

entonces

2 => 5
8 => 1

¿Qué ves?


Título: Re: Problema criptograma
Publicado por: i-node en 1 Mayo 2016, 22:11 pm
Yo lo he sacado con papel y boli  ;D

Pero bueno: aquí va una pista... dos pistas en una sola idea:

1 => 8
5 => 2

entonces

2 => 5
8 => 1

¿Qué ves?

Unas equivalencias, no? Que cada numero, cifrado, siempre tendra un valor. Es decir, el 1, tras encriptarlo, siempre tendra un valor de 8 y el 5 de 2.

Muchas gracias.


Título: Re: Problema criptograma
Publicado por: HardForo en 1 Mayo 2016, 22:21 pm
Lo que te dice @MAFUS es:

Código
  1. decript(encryp(valor)) = valor

Es un tipo de encriptacion simple porque la funcion es biyectiva, en la vida real no pasa eso  ;D




Título: Re: Problema criptograma
Publicado por: MAFUS en 1 Mayo 2016, 22:30 pm
cifrado: Sumar 7 al valor. Si el resultado es mayor de 10 restarle 10.
Visto así sacar el descifrado no debe ser difícil.


Título: Re: Problema criptograma
Publicado por: i-node en 1 Mayo 2016, 22:33 pm
Lo que te dice @MAFUS es:

Código
  1. decript(encryp(valor)) = valor

Es un tipo de encriptacion simple porque la funcion es biyectiva, en la vida real no pasa eso  ;D




No habia leido ese termino (funcion biyectiva) en mi vida. Tendre que investigar y buscar codigo de ejemplo en Google.

cifrado: Sumar 7 al valor. Si el resultado es mayor de 10 restarle 10.
Visto así sacar el descifrado no debe ser difícil.

No, no le resta 10 si es mayor de 10, hace un modulo, no una division.


Título: Re: Problema criptograma
Publicado por: MAFUS en 1 Mayo 2016, 22:36 pm
Hazlo con papel y boli, verás lo que te digo  ;)


Título: Re: Problema criptograma
Publicado por: class_OpenGL en 1 Mayo 2016, 23:10 pm
Lo mejor para este tipo de ejercicios es, como bien ha apuntado MAFUS, escribir la codificación de cada posible dígito sobre papel.

Tenemos que para codificar los dígitos tenemos que sumarles 7 y hacerle el módulo con 10. Si seguimos esta regla, cada dígito quedaría así:
0 -> 7
1 -> 8
2 -> 9
3 -> 0
4 -> 1
...
9 -> 6

Sabiendo el patrón que se produce, es sencillo hallar la forma de volver atrás...


Título: Re: Problema criptograma
Publicado por: geeke en 1 Mayo 2016, 23:30 pm
El proceso para descifrar esto sería

Código
  1. if n >= 7
  2.   n = n - 7
  3. else
  4.   n = n + 3


Título: Re: Problema criptograma
Publicado por: i-node en 2 Mayo 2016, 05:00 am
El proceso para descifrar esto sería

Código
  1. if n >= 7
  2.   n = n - 7
  3. else
  4.   n = n + 3


Muchas gracias!

Ejercicio terminado :)

Código:
#include <iostream>

using std::cout;
using std::cin;

int main() {
const int tamano = 4;
int numero = 0, numeroTmp[4], cont = tamano -1;

while(numero == 0) {
cout << "Introduce el numero cifrado: ";
cin >> numero;
}

while(numero != 0) {
numeroTmp[cont] = (numero % 10);
numero /= 10;
cont--;
}

numero = numeroTmp[0];
numeroTmp[0] = numeroTmp[2];
numeroTmp[2] = numero;

for(cont = 0; cont < tamano; cont++)
if(numeroTmp[cont] >= 7)
numeroTmp[cont] -= 7;
else
numeroTmp[cont] +=3;

cout << "\nEl numero descifrado es: " ;

for(int cont = 0; cont < tamano; cont++)
cout << numeroTmp[cont];

cout << "\n";

return 0;
}


Título: Re: Problema criptograma
Publicado por: + 1 Oculto(s) en 2 Mayo 2016, 18:02 pm
divide y venceras... usa funciones te simplificara la vida


Título: Re: Problema criptograma
Publicado por: i-node en 2 Mayo 2016, 19:17 pm
divide y venceras... usa funciones te simplificara la vida

Estoy de acuerdo. Es solo que voy haciendo los ejercicios de un libro mientras aprendo C++ y, aunque ya se utilizar funciones, prefiero hacer los ejercicios con los datos que me ha dado el libro, porque tal vez sea para que aprenda ciertas caracteristicas de lo que me acaban de explicar en ese capitulo.