sábado, 9 de julio de 2011

Cifrado por sustitución


Esta entrada está dedicada a todos esos wargames que nos enseñan cosas nuevas en cada intento, y permiten que con algo de esfuerzo veamos el fruto reflejado en conocimiento y respuestas excitantes.





/***
* CifradoPorSustitucion
* Este codigo fue realizado hace un tiempo para solucionar el reto de una
* pagina de wargames llamada yashira, donde se pedia arreglar el codigo
* que permitiera descifrar un mensaje. Para no saltarme las reglas decidi hacerle
* unas modificaciones con el fin de que aquellos que lo vean util, se pongan en la tarea
* de encontrar que les falta para obtener su respuesta. :)
*
* @author : D-m-K, Red Informatica Colombiana
***/


import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;

public class CifradoPorSustitucion {
//Miembros de clase

static BufferedReader br;
//Patron de cadenas para cifrar y descifrar
public final static String str1 = "!#$;*/(=_?{¡@*-+1234567890";
public final static String str2 = "abcdefghijklnñopqrstuvwxyz";
public static String mensaje;
public static BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));

//Main :P
public static void main(String[] args) throws IOException {
//Instacio y defino los datos de entrada

int op;
do {
System.out.println(" 1. Cifrar datos");
System.out.println(" 2. Descifrar datos");
System.out.println(" 3. Salir :P");
System.out.print(" Opcion >> ");
op = Integer.parseInt(entrada.readLine());
//Evaluo la opcion ingresada
switch (op) {
case 1:
Criptar();
break;
case 2:
DesCriptar();
break;
case 3:
System.out.println("Hasta la proxima! :D");
System.exit(0);
break;
}
} while (op != 3);
}

/**
* Codifico los datos del fichero de entrada
* @throws IOException
*/
public static void Criptar() throws IOException {
System.out.print("Ingresa el mensaje a cifrar >> ");
mensaje = entrada.readLine();
mensaje = mensaje.toLowerCase();

System.out.println("\nMensaje legible : " + mensaje);
for (int i = 0; i < str1.length(); i++) {
mensaje = mensaje.replace(str2.charAt(i), str1.charAt(i));
}
System.out.println("Mensaje cifrado : " + mensaje);
}

/**
* Decodifica los datos del fichero de entrada
* @throws IOException
*/
public static void DesCriptar() throws IOException {
System.out.print("Ingresa el mensaje a descifrar >> ");
mensaje = entrada.readLine();
mensaje = mensaje.toLowerCase();

System.out.println("\nMensaje cifrado : " + mensaje);
for (int i = 0; i < str1.length(); i++) {
mensaje = mensaje.replace(str1.charAt(i), str2.charAt(i));
}
System.out.println("Mensaje legible : " + mensaje);
}
}

2 comentarios:

  1. Disculpe, por que en la siguiente linea se ocupa el str1.length y no el str2?
    for (int i = 0; i < str1.length(); i++) {
    mensaje = mensaje.replace(str2.charAt(i), str1.charAt(i));
    }

    ResponderEliminar
  2. Hola!

    Eso es porque en este caso, lo que estás haciendo es definiendo dos cadenas de la misma longitud, es decir que para cada letra del alfabeto, existe una letra que representa un caracter encriptado.

    Entonces los pasos que se realizan son :

    1. Recorriendo los caracteres que tienes para cifrar/descifrar.
    2. Del mensaje que está cifrado/descifrado, lo reemplazas con el caracter que corresponde en la otra cadena.
    3. Una vez se hace el reemplazo, el resultado final es que estarías cifrando/descifrando tu mensaje.

    ResponderEliminar