Problema criptograma

Iniciado por i-node, 1 Mayo 2016, 20:01 PM

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

i-node

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

HardForo

No veo funciones, necesitas dos una ida y otra de vuelta
HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *

i-node

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.

MAFUS

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?

i-node

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.

HardForo

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


HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *

MAFUS

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

i-node

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.

MAFUS

Hazlo con papel y boli, verás lo que te digo  ;)

class_OpenGL

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

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL