Cifrado Vigenere

Estándar

En la clase de matemáticas discretas 2 toca ver el tema de criptografía, un mundo realmente interesante, en esta ocasión se me ocurrió hacer un pequeño código que cifrara un mensaje utilizando Vigenere, No es el código mas optimizado, pero es útil para fines didácticos.

Lo que hace es que en base al alfabeto que le indiquemos va a aplicar la formula Y=X+Z(mod 26) , y cifrara el texto que le demos, además de quitarle los espacio y poner las letras a mayúsculas para evitar errores, como dije antes el código no es el mejor pero puede servir para referencia y lo mejor es que lo puedes modificar a tu antojo


import java.util.Scanner;
public class Cifrar {
Scanner in=new Scanner(System.in);
private char[] alfa = {‘A’,’B’,’C’,’D’,’E’,’F’,’G’,’H’,’I’,’J’,’K’,
     ‘L’,’M’,’N’,’O’,’P’,’Q’,’R’,’S’,’T’,’U’,’V’,’W’,’X’,’Y’,’Z’};
    private char[] getCadena(String cadena){
        /*Obtiene una cadena y le quita espacios y   *
         *cambia a mayusculas todas las letras y     *
         *cada letra la pone en un arreglo tipo char**/
        String cade=cadena.toUpperCase().replaceAll(” “, “”) ;
        char [] chain=new char [cade.length()];
        chain=cade.toCharArray();
        return chain;
    }
    private int[] cadenaToNum(char []chain){
        /*Ya con el arreglo char cambiamos los caracteres a   *
         * numeros para realizar la fórmula adecuada al caso  *
         * y el resultado lo guardamos en un arreglo tipo int */
        int [] ctn = new int [chain.length];
        int x=0,y=0,z=0;
        for(x=0;x<chain.length;x++){
            for(y=0;y<alfa.length;y++){
                if (alfa[y] == chain[z]){
                   ctn[z]=y;
                   z++;
                   break;
                }
            }
        }
        return ctn;
    }
    private String getTexto(){
        String texto=“”;
        System.out.println(“Introduce el Texto”);
        texto=in.nextLine();
        return texto;
    }
    private String getClave(){
        String clave=“”;
        System.out.println(“Introduce la clave”);
        clave=in.nextLine();
        return clave;
    }
    private char[] numToCadena(int[] cade){
        char [] ntc = new char [cade.length];
        int x=0,y=0,z=0;
        for(x=0;x<cade.length;x++){
            ntc[x]=alfa[cade[x]];
        }
        return ntc;
    }
    private String mostrarTexto(char[] a) {
        int x=0;
        String resultado=“”;
        for(x=0;x<a.length;x++){
            resultado+=a[x];
        }
        return resultado;
    }
    private int[]  cifrarNumeros(){
        /*Ya teniendo los números en el arreglo se toman los números *
         *de la clave y el texto y se realiza la siguente fórmula    *
         *      Y=X+Z(mod 26)       cifr=+txtclr+seed(mod 26)          *
         *se regresa un arreglo con los numeros cifrados             *
         *ahora hay que cambiar esos numero a letras                 */
        int[] seed = cadenaToNum(getCadena(getClave()));
        int[] txtclr = cadenaToNum(getCadena(getTexto()));
        int[] cifr = new int[txtclr.length];
        int x=0,y=0;
        for(x=0;x<txtclr.length;x++){
            if(y==seed.length){
                y=0;
                cifr[x]=(txtclr[x]+seed[y])%alfa.length;
            }
            else
                cifr[x]=(txtclr[x]+seed[y])%alfa.length;
            y++;
        }
        System.out.println(“El texto cifrado es:”);
        return cifr;
    }
    private int[] descifrarNumeros(){
        /*Ya teniendo los números en el arreglo se toman los números    *
         *de la clave y el criptograma y se realiza la siguente fórmula *
         *      X=Y+(-Z) (mod 26)       decifr=(crpgrm)+(-seed)(mod 26)   *
         *se regresa un arreglo con los numeros descifrados             *
         *ahora hay que cambiar esos numero a letras                    */
        int[] seed = cadenaToNum(getCadena(getClave()));
        int[] crpgrm = cadenaToNum(getCadena(getTexto()));
        int[] decifr = new int[crpgrm.length];
        int x=0,y=0;
        for(x=0;x<crpgrm.length;x++){
            if(y==seed.length){
                y=0;
                decifr[x]=crpgrm[x]-seed[y];                 if(decifr[x]<0){
                    decifr[x]=alfa.length-(decifr[x]*-1);
                    }
            }
            else{
                decifr[x]=crpgrm[x]-seed[y];
                if(decifr[x]<0){
                    decifr[x]=alfa.length-(decifr[x]*-1);
                    }
            }
            y++;
        }
        System.out.println(“El texto descifrado es:”);
        return decifr;
    }
    public void cifradoVigenere (){
        System.out.println(“”);
System.out.println(mostrarTexto(numToCadena(cifrarNumeros())));
    }
    public void descifradoVigenere (){
        System.out.println(“”);
        System.out.println(mostrarTexto(numToCadena(descifrarNumeros())));
    }
}

public class Vigenere {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        Cifrar obj=new Cifrar ();
        int check=0;
        do{
            System.out.println(“Bienvenido”);
            System.out.println(“¿Qué deseas hacer?”);
            System.out.println(“1.- Cifrar Texto”);
            System.out.println(“2.- Descifrar Texto”);
            System.out.println(“3.- Salir”);
            check=in.nextInt();
            switch(check){
                case 1:
                    obj.cifradoVigenere();
                break;
                case 2:
                    obj.descifradoVigenere();
                break;
                default:
                    System.out.println(“Hasta Pronto”);
            }
        }
        while(check !=3);
    }
}

Anuncios

2 comentarios en “Cifrado Vigenere

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s