24/12/09

Encriptación: Metodo Bífido en java



El método Bífido es un cifrado fraccionario. Es decir que cada letra viene representada por una o más letras o símbolos, y donde se trabaja con estos símbolos más que con las letras mismas.

El método comienza con la utilización de un alfabeto ordenado o desordenado (depende del grado de dificulad que se le pretenda dar en su descifrado) en una matriz 5x5.

En este ejemplo utilizaremos la siguiente matriz:

Al ser una matriz de 5x5 nos vemos obligados a cifrar de la misma forma la I y la J. El contexto nos permitirá distinguir cual de las dos letras se pretendía cifrar.
Para cifrar el texto en claro se escriben los equivalentes numéricos de cada letra, utilizando sus "coordenadas".

Por ejemplo: HOLA MUNDO, genera las siguientes coordenadas (f,c) 233431113245331434, y para proceder con la encriptacion la cadena de coordenadas resultantes es dividida en dos:
233431113
245331434
y se forma una nueva cadena de coordenadas 22 34 35 43 33 11 14 13 34 las cuales formaran el nuevo mensaje encriptado GOPS NADCO.

Este método altera la frecuencia de los caracteres a diferencia de lo que ocurre por ejemplo con los cifrados monoalfabéticos.

La interfaz

Creamos una clase llamada bifido.java, en esta clase colocamos el codigo respectivo para realizar la encriptacion como la desencriptacion, el codigo se encuentra comentado.


/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class Bifido {

    char[][] matriz = new char[6][6];
    char[] mensaje;
    private String abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";    
    
    public Bifido(){   
        //la tabla esta formada por 25 letras, donde I=J
        matriz[1][1]='A'; matriz[1][2]='B';matriz[1][3]='C';matriz[1][4]='D';matriz[1][5]='E';
        matriz[2][1]='F'; matriz[2][2]='G';matriz[2][3]='H';matriz[2][4]='I';matriz[2][5]='K';
        matriz[3][1]='L'; matriz[3][2]='M';matriz[3][3]='N';matriz[3][4]='O';matriz[3][5]='P';
        matriz[4][1]='Q'; matriz[4][2]='R';matriz[4][3]='S';matriz[4][4]='T';matriz[4][5]='U';
        matriz[5][1]='V'; matriz[5][2]='W';matriz[5][3]='X';matriz[5][4]='Y';matriz[5][5]='Z';        
    }
    
    public String Encriptar(String t){
        t = clean(t);
        String nt="";
        String enc="";
        int fila ;
        int col;
        //para cada caracter se extrae el par de numeros correspondientes en la matriz
        for(int i=0; i<t.length();i++){
            nt = nt + getposicion(t.charAt(i));
        }           
        //Ahora se realiza el proceso de encriptacion
        for(int i=0;i<nt.length()/2;i++){            
            fila = Integer.parseInt(String.valueOf(nt.charAt(i)));             
            col = Integer.parseInt(String.valueOf(nt.charAt(i + nt.length()/2)));          
            enc = enc + String.valueOf(matriz[fila][col]);            
        }                
        enc=build(enc);
        return enc;
    }
    
    public String Desencriptar(String t){
        t=clean(t);
        String nt="";
        String tmp1="";
        String tmp2="";
        boolean b=true;
        //para cada caracter se extrae el par de numeros correspondientes en la matriz
        for(int i=0; i<t.length();i++){
            nt = nt + getposicion(t.charAt(i));
        }
        //como la cadena de numeros se encuentra encriptada, se procede
        //a su nuevo ordenamiento
        for(int i=0;i<nt.length();i++){
            if(b){
                tmp1= tmp1 + nt.charAt(i);
                b=false;
            }
            else
            {
                tmp2= tmp2 + nt.charAt(i);
                b=true;
            }
        }        
        nt= tmp1+tmp2;
        tmp1="";
        int fila;
        int col;
        //ahora que ya se tiene a la cadena de numeros con el orden original
        //se procede a reconstruir el mensaje
        for(int i=0; i<nt.length();i+=2){
            fila = Integer.parseInt(String.valueOf(nt.charAt(i)));     
            col = Integer.parseInt(String.valueOf(nt.charAt(i+1)));     
            tmp1 = tmp1 + String.valueOf(matriz[fila][col]);            
        }        
        tmp1=build(tmp1);
        return tmp1;
    }    
    //obtiene la posicion de filas y columnas correspondientes al caracter
    //pasado como parametro en la matriz
    private String getposicion(char c){
        String p = null;
        if(c=='J'){//como el caracter J no se encuentra en la tabla
            //se añade automaticamente con la posicion de I
            p="24";
        }
        else{
            for(int i=0;i<6;i++){
                for(int j=0;j<6;j++){
                    if(c==matriz[i][j]){
                      p = Integer.toString(i)+Integer.toString(j);
                      break;
                    }                
                }
            }
        }
        return p;
    }
    //encargado de limpiar el mensaje extrayendo solo las letras y
    //guardando los caracteres especiales para rearmar el mensaje despues
    private String clean(String t){   
      t = t.toUpperCase();  
      mensaje = t.toCharArray();
      String tmp1="";      
      for(int i=0;i<mensaje.length;i++){
          int x = abc.indexOf(mensaje[i]);
          if(x!=-1){//es una letra valida
              tmp1=tmp1+mensaje[i];
          }
      }       
      return tmp1;
    }
    //reconstruye el mensaje con las palabras encriptadas/desencriptadas
    //añadiendo los caracteres especiales
    private String build(String t){
        String tt="";
        int count=0;
        for(int i=0;i<mensaje.length;i++){
            int x = abc.indexOf(mensaje[i]);
            if(x!=-1){                
                tt= tt + t.charAt(count);
                count++;
            }
            else
            {
                tt=tt + mensaje[i];
            }    
        }
        return tt;
    }
}


Para implementar este clase en nuestra interfaz, hacemos las llamadas correspondientes a los objetos jButton


private void cmdEncriptarActionPerformed(java.awt.event.ActionEvent evt) {
        String t = texto1.getText();        
        texto2.setText(b.Encriptar(t));
} 

private void cmdDesencriptarActionPerformed(java.awt.event.ActionEvent evt) {
        String t = texto1.getText();        
        texto2.setText(b.Desencriptar(t));
}

El resultado


Ahora para incentivar en la construccion y prueba de este codigo, te presento a Natalia

Si quieres saber mas de ella decifra el siguiente mensaje, encontraras informacion importante, asi como su mail para que chatees con ella.


DZLE OC CDEYTPN, NCEST ACÑNDFTB DO CI TOM, AQBDQOA.
VN UQKIR ST EDCTA, YMDBBN Y DAYZAK, NR LÚEFSX DHSDCMDA
YF KT "WSOT UCCAVL", CWCMTL CAVV QBG DB FQLD: "AAQ 
GXQAPA DOPSQ ACQ KUO TY OGQL HSDLDEGDC AVAO SR IIQT
UBD AZ TMAZOCQHM SAL IYLZA VTMACCTNS, APNQN L LQDNDZACN".
DI GORLKCD QPDSCXA VOD MDBC NI ITSMAA MI HQFH_2590@NTSMDSI.UAP
DWOOQE!!!


SUERTE!!!

10 comentarios:

  1. Solo quiero decir que el codigo se ve muy bien hecho, pero no me funciona en netbeans.

    necesito un código para encriptar en V, las filas se le piden al usuario y el numero de columnas depende del texto que el usuario digite, si me pueden ayudar lo necesito de inmediato es para hoy, gracias

    ResponderEliminar
  2. por favor podrías poner el código para descargar, me ayudaría mucho.
    GRACIAS.

    ResponderEliminar
  3. que buena descifrado y el algoritmo por igual, si no es mucha molestia podrías poner el código para descargar???

    ResponderEliminar
  4. vamos que con la clase bifido tienen todo, solo es implementar la interfaz gui. intentenlo que es muy facil

    ResponderEliminar
  5. esto me haria ganar un curso... me harias un gran favor de un link de la dscarga del codigo... t lo agradeceria mi mail nielias@hotmail.es

    ResponderEliminar
  6. Amigo que no me reconoce este codigo en el evento del Jbutton
    b.Encriptar(t)
    b.Desencriptar(t)

    no me reconoce b
    Ayuda amio

    ResponderEliminar
  7. solo tienes que llamar la clase amigo de la siguiente manera no solo es copiar el codigo si no entenderlo te dejo el codigo simple Bifido b= new Bifido();

    ResponderEliminar
  8. puedes subir el proyecto de netbeans completo sete agradece

    ResponderEliminar
  9. Que tal socio te reto a hacer un Encriptado y Desencriptado de un Archivo properties .. Donde se encuentran los datos de la conexion a SQL...

    ResponderEliminar