14 julio, 2012

Cifrado de César en Java

Cifrado de César en Java


Regresando de un largo descanso ahora quiero compartirles una serie de programas realizados en Java para ciertos fines, voy a empezar con un poco de criptografía, y en específico el cifrado de César, para los que no han escuchado de este, a continuación un breve resumen:

"En criptografía, el cifrado César, también conocido como cifrado por desplazamiento, código de César o desplazamiento de César, es una de las técnicas de codificación más simples y más usadas. Es un tipo de cifrado por sustitución en el que una letra en el texto original es reemplazada por otra letra que se encuentra un número fijo de posiciones más adelante en el alfabeto. Por ejemplo, con un desplazamiento de 3, la A sería sustituida por la D (situada 3 lugares a la derecha de la A ), la B sería reemplazada por la E, etc. Este método debe su nombre a Julio César, que lo usaba para comunicarse con sus generales.

El cifrado César muchas veces puede formar parte de sistemas más complejos de codificación, como el cifrado Vigenère, e incluso tiene aplicación en el sistema ROT13. Como todos los cifrados de sustitución alfabética simple, el cifrado César se descifra con facilidad y en la práctica no ofrece mucha seguridad en la comunicación."

Si desean profundizar en el arte de la criptografía y la seguridad informática les recomiendo que visiten el siguiente sitio:
Hackem Community Website at EPN (Escuela Politécnica Nacional)

El sitio pertenece a la Comunidad de Software Libre y Hackers Éticos de la Facultad de Ingeniería en Sistemas Informáticos y de Computación de la Escuela Politécnica Nacional, la cual es actualmente la sede de OWASP (Open Web Application Security Project) del Capítulo Nacional y del Capítulo Universitario de Ecuador, más información en el enlace superior.

En esta Comunidad se suelen dar cursos y capacitaciones en áreas como Software Libre, GNU/Linux y Seguridad Informática y Ethical Hacking, incluso personas que residan en Ecuador pueden participar activamente de forma presencial.

Pero bueno, ahora entrando en materia, el cifrado de César es llamado de desplazamiento, porque mueve cada letra un determinado número de espacios en el alfabeto, en la imagen inferior se representa de forma gráfica:


Es decir que si nosotros queremos enviar un mensaje con el texto en claro: "Kathy" y utilizamos una llave con un valor de 4, el resultado en texto cifrado (En el Idioma Inglés) sería: "Oexlc" y en Español sería "Ñexlc".

Con el ejemplo anterior podemos ver que solo desplazamos 4 letras a todos los caracteres presentes en la palabra, pudiendo ser aplicado a frases completas también; para tener una referencia, este estas son las equivalencias para una llave con valor de 6 para el Idioma Español:

Texto original:   ABCDEFGHIJKLMNÑOPQRSTUVWXYZ
Texto codificado: GHIJKLMNÑOPQRSTUVWXYZABCDEF

La codificación también se puede representar usando aritmética modular, transformando las letras en números, de acuerdo al esquema A = 0, B = 1,..., Z = 26. La codificación de la letra x con un desplazamiento n puede ser descrita matemáticamente como:

E_n(x) = x + n \mod {27}.

Y la decodificación se hace de manera similar:

D_n(x) = x - n \mod {27}.

La operación de sustitución se conserva siempre a lo largo de todo el mensaje, por lo que el cifrado se clasifica como un cifrado de tipo sustitución monoalfabética, en oposición a la sustitución polialfabética.

El programa que esta vez les comparto es uno sencillo (próximamente uno mejor) donde solo realizamos la función de descifrado a una cadena que podemos mandar en el Main, por lo tanto el código más importante de esta sería:

    public String decrypt(int c)
    {
        int posicion = c + desplazamiento;
        if(posicion > array.length - 1)
        {
              posicion = posicion - array.length;
        }
        String decod = String.valueOf(array[posicion]);
        return decod;
    }

Pero ustedes pueden hacer su propia implementación mejorada utilizando algunas entradas explicadas anteriormente, por ejemplo el programa podría leer archivos planos (Lectura de Archivos en Java), podría leer los datos desde teclado (Scanner & InputStreamReader), podría ser en una interfaz gráfica con un Formulario, etc.

Otra función que necesitamos es una que recorra la cadena de caracteres (el mensaje) para poderlo descifrar carácter por carácter:

    private void recorrerMensaje()
    {
        String decod = "";
        for(int i = 0; i <= mensaje.length() - 1; i++)
        {
            caracter = mensaje.substring(i, i + 1);
            if(!caracter.equals(" "))
            {
                int posicion = getPosicionCaracter(caracter);
                decod = decrypt(posicion);
                clave += decod;
            }
            else
            {
                clave += " ";
            }
        }
    }

Eso es lo básico que necesitamos para nuestra implementación, si deseas una copia del código fuente completo para probarlo en tu computador, lo puedes encontrar en la parte inferior del blog, en la Java Box.

La clase se llama CaesarCipher.java, ustedes deberán crear una clase Main donde creamos la instancia del CaesarCipher y mandamos como parámetro el mensaje cifrado, un ejemplo:

Cipher descifrar = new Cipher();
//Desciframos KATHY --> GWPDU
System.out.println(descifrar.descifrarMensaje("GWPDU", 4));

Por cierto en la implementación que se pueden descargar el descifrado utiliza una llave dinámica, para el ejemplo está 4.

No hay comentarios.:

Publicar un comentario