El cifrador de Polybios

Iniciado por Tronos154, 26 Enero 2016, 18:47 PM

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

Tronos154

Buenas gente,he estado intentando hacer un método en Java que dado dos valores enteros y una palabra crea una matriz de las dimensiones de estos dos valores y a cada posición de la matriz le asigna el valor ordenado del alfabeto,después coge cada letra de la palabra y almacena en un String los valores en los cuales se sitúa cada letra de la palabra en la matriz.  El problema es que este me devuelve unos valores que no corresponden a los previstos cuando cifro la palabra manualmente,llevo varios días dándole vueltas al problema y no encuentro el error. Estaría muy agradecido si alguno me muestra el error que yo no he sabido encontrar. Un saludo.



Código (java) [Seleccionar]
public class CifradoPolybios {

   public String cifrar(int fila, int columna, String cadena) {
       if ((fila * columna) < 27) {
           fila = 5;
           columna = 6;
       }
       char[][] leyenda = new char[fila][columna];                 //Array donde se le asigna los valores al abecedario.
       int contadorFila = 0;
       int contadorColumna = 0;
       int contadorAbecedario = 96;
       char letra;
       while (contadorFila < fila) {                               //Bucle que da valores al array correspondientes con el abecedario.

           leyenda[contadorFila][contadorColumna] = (letra = (char) contadorAbecedario);

           if (contadorColumna == (columna - 1)) {
               contadorColumna = 0;
               contadorFila++;
           } else {
               contadorColumna++;
               contadorAbecedario++;
           }
       }
       contadorFila = 0;
       contadorColumna = 0;
       cadena = cadena.toLowerCase();
       int contadorLetra = 0;
       String cadenaEncriptada = null;                                 //Variable que almacena la palabra una vez cifrada.
       while (contadorLetra < cadena.length()) {                       //Bucle que cifra la palabra usando el array una vez ha sido asignado el valor.
           if (cadena.charAt(contadorLetra) == ((char) 32)) {
               contadorLetra++;
           }
           if (cadena.charAt(contadorLetra) == leyenda[contadorFila][contadorColumna]) {
               if (cadenaEncriptada == null) {
                   cadenaEncriptada = String.valueOf(contadorFila) + "" + String.valueOf(contadorColumna) + "";
               }
               cadenaEncriptada += String.valueOf(contadorFila) + "" + String.valueOf(contadorColumna) + "";
               contadorLetra++;
               contadorFila = 0;
               contadorColumna = 0;
           } else {

               if (contadorColumna == (columna - 1)) {
                   contadorColumna = 0;
                   contadorFila++;
               } else {
                   contadorColumna++;
               }
           }
       }
       return cadenaEncriptada;
   }
}

crack81

#1
Hola no he revisado detenidamente tu codigo asi que no se cual sea
exactamente el problema
pero me imagino que esta intentado hacer este cifrado https://es.wikipedia.org/wiki/Cuadrado_de_Polibio

si es asi revisa este codigo que arme donde codifica como esta en la wikipedia
solo con la diferiencia que cuando se escribe un caracter que no esta en la tabla como
como el espacio en blanco lo sustituye por un doble cero "00"

si tienes dudas o no es lo que buscas avisa
Código (java) [Seleccionar]
public class CifradoPolybios {

    public String cifrar(final String cadena) {
   
       final String TABLA_POLIBO[] = {"11", "12", "13", "14", "15",
                                      "21", "22", "23", "24", "24", "25",
                                      "31", "32", "33", "34", "35",
                                      "41", "42", "43", "44", "45",
                                      "51", "52", "53", "54", "55"};

        char strMayusculas[] = cadena.toUpperCase().toCharArray();
        StringBuilder Result = new StringBuilder();

        for (int i = 0; i < strMayusculas.length; i++) {
            char caracter =strMayusculas[i];   
            if (caracter >= 'A' && caracter <= 'Z') {
                if (caracter == 'I' || caracter == 'J') Result.append("24");//es el equivalente para I y J
                else Result.append(TABLA_POLIBO[caracter-65]);
                continue;
            }
            Result.append("00");//si algun valor no esta en la tabla
        }
        return Result.toString();
    }

    public static void main(String[] args) {
        System.out.println(new CifradoPolybios().cifrar("Wikipedia la enciclopedia libre"));
    }
}
Si C/C++ es el padre de los lenguajes entonces ASM es dios.

Tronos154

Ante todo gracias por la ayuda Crack81 , he estado observando tu código y mas o menos es igual al mio exceptuando que el array que creas en las primeras lineas es fijo para cualquier texto que cifres,en cambio en el mio  la coordenada de una letra varia dependiendo del numero de filas o columnas que le digas.He estado modificando mi código con el método StringBuilder pero sigue dándome valores incorrectos al cifrar un texto  :-( :-( :-(