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.
#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;
}
No veo funciones, necesitas dos una ida y otra de vuelta
Cita de: boctulus en 1 Mayo 2016, 20:41 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.
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?
Cita de: 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?
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.
Lo que te dice @MAFUS es:
decript(encryp(valor)) = valor
Es un tipo de encriptacion simple porque la funcion es biyectiva, en la vida real no pasa eso ;D
cifrado: Sumar 7 al valor. Si el resultado es mayor de 10 restarle 10.
Visto así sacar el descifrado no debe ser difícil.
Cita de: boctulus en 1 Mayo 2016, 22:21 PM
Lo que te dice @MAFUS es:
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.
Cita de: 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.
No, no le resta 10 si es mayor de 10, hace un modulo, no una division.
Hazlo con papel y boli, verás lo que te digo ;)
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...
El proceso para descifrar esto sería
if n >= 7
n = n - 7
else
n = n + 3
Cita de: Geeke en 1 Mayo 2016, 23:30 PM
El proceso para descifrar esto sería
if n >= 7
n = n - 7
else
n = n + 3
Muchas gracias!
Ejercicio terminado :)
#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;
}
divide y venceras... usa funciones te simplificara la vida
Cita de: qwery.azc en 2 Mayo 2016, 18:02 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.