miércoles, 21 de mayo de 2014

Como cifrar tus comentarios, mensajes etc. en facebook

CIFRADO CESAR
Ejemplo hecho en java para cifrar mensajes basados en el cifrado cesar. Hay muchos tipos de cifrado y mucho mas complejos pero este es un ejemplo sencillo de lo que es el cifrado, y puedes usar otros mas complejos


Descripción
Uno de los criptosistemas más antiguos se lo debemos a Julio César. El método es bastante sencillo, está basado en sustituciones: la letra cifrada se obtiene a partir de la original desplazándola k posiciones a la derecha. El alfabeto se considera cíclico, esto es que la letra siguiente a la z es la a y que la anterior a la a es la z.
La llave (clave) de este cifrado es el valor de k que se ha usado para cifrar el texto, y este valor debe permanecer secreto, ya que si se hace público, cualquiera podría descifrar el texto de forma fácil, con sólo desplazar a la izquierda las letras del texto cifrado k lugares a la izquierda.
A cada letra se le asigna un código numérico que no es más que su posición en el alfabeto, la codificación de las letras es por tanto:
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
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
De una forma más formal el cifrado de César se puede definir como:
E sub k = (i+k) mod q
donde i mod n denota al único entero j entre 0 y n-1 tal que j es congruente con i módulo n. Además, q representa el total del letras del alfabeto (en el caso del castellano q = 27), i el índice de letra que se quiere cifrar y k el desplazamiento que se va a aplicar. Se supone que tanto k como i están entre 0 y q-1 (ambos extremos incluidos), por tanto tendremos q cifrados de César diferentes, uno para cada valor de k que escojamos. El desplazamiento que aplicaba César era k = 3 según los documentos de la época, aunque luego el cifrado se generalizó al que se ha expuesto anteriormente.
Veamos algunos ejemplos:
E sub 26 (IBM) = HAL 
E sub 6 (HOLA) = NUQA 
E sub 1(PATATA) = QBUBUB

Criptoanálisis
El criptoanálisis de textos cifrados con este método va a ser muy fácil, ya que existen sólo 27 llaves (claves). Además, como con todos los cifrados monoalfabéticos, se van a mantener las frecuencias de aparición de las letras del alfabeto. En este caso estarán desplazadas según la llave que se haya escogido. 

Fuerza bruta
Ya que sólo existen 27 llaves posibles, se trata de ir probando cada uno de los posibles desplazamientos hasta que el texto cifrado cobre sentido. Vamos a intentar descifra el texto:
JYOWAVNYHMOH:
 0 JYOWAVNYHMOH
 1 KZPXBWÑZINPI
 2 LAQYCXOAJÑQJ
 3 MBRZDYPBKORK
 4 NCSAEZQCLPSL
 5 ÑDTBFARDMQTM
 6 OEUCGBSENRUN
 7 PFVDHCTFÑSVÑ
 8 QGWEIDUGOTWO
 9 RHXFJEVHPUXP
10 SIYGKFWIQVYQ
11 TJZHLGXJRWZR
12 UKAIMHYKSXAS
13 VLBJNIZLTYBT
14 WMCKHJAMUZCU
15 XNDLOKBNVADV
16 YÑEMPLCÑWBEW
17 ZOFNQMDOXCFX
18 APGÑRNEPYDGY
19 BQHOSÑFQZEHZ
20 CRIPTOGRAFIA
21 DSJQUPHSBGJB
22 ETKRVQITCHKC
23 FULSWRJUDILD
24 GVMTXSKVEJME
25 HWNUYTLWFKNF
26 IXÑVZUMXGLÑG

Como podemos observar la prueba numerada como 20 contiene el texto llano correspondiente a nuestro texto cifrado. Por tanto el texto JYOWAVNYHMOH se descifra como CRIPTOGRAFIA.

Análisis estadístico del texto
Supongamos que nos encontramos con el siguiente texto cifrado:
Edqjnrn qr hud od flxgdg iuhvfd b wudqtxlod gh whpsorv b fdqdohv
txh br hvshuded. Ho oxjdu kdeld shuglgr vx ruljlqdo fdudfwhu wdl
kdvwd wdo sxqwr txh or txh txhgded uhvxowded devxugr b shuyhuvr
hq phglr gh wdq dfxvdgd rfflghqwdolcdflrq. Orv uhvlghqwhv
hawudqmhurv hvwdedq gh dfxhugr hq txh kdeld vlgr xq oxjdu
kdelwdeoh kdvwd txh oohjdurq odv wursdv hvwdgrxqlghqvhv.
Lo primero que hay que hacer es hacer un análisis estadístico del texto cifrado y ver cuáles son las letras más frecuentes, que en este caso son d, h, v, u y r, y se intentan sustituir por las letras más frecuentes del castellano, que según la gráfica anterior son:e, a, o, s y n.
Probamos a sustituir la d por la e, esto significa que estamos suponiendo que el texto se cifró con E sub 26, ya que d = (e + 26) mod 27 , luego si deshacemos los veintiséis desplazamientos a la derecha que hace E sub 26 tenemos que la primera palabra del texto Edqjnrn pasa a ser Dcpimqm, que no tiene mucho sentido en castellano. Luego parece que E sub 26 no se usó para cifrar el texto.
Vamos a probar ahora a sustituir la segunda letra más probable del texto cifrado, h por la e a ver si hay mejor suerte. Este cambio supone que para cifrar se usó E sub 3. Probemos pués con la primera palabra a ver si toma sentido. Edqjnrn se convierte en Bangkok, que parece una palabra castellana. Para asegurarnos si verdaderamente hemos encontrado la llave vamos a probar ahora con la palabra flxgdg. Esta palabra pasa a ser ciudad, que es claramente una palabra castellana. Desciframos el resto del texto y obtenemos:
Bangkok no era la ciudad fresca y tranquila de templos y canales
que yo esperaba. El lugar había perdido su original carácter tai hasta
tal punto que lo que quedaba resultaba absurdo y perverso en medio
de tan acusada occidentalización. Los residentes extranjeros
estaban de acuerdo en que había sido un lugar habitable hasta
que llegaron las tropas estadounidenses.
Luego ya sabemos que la llave que se ha usado para cifrar el texto ha sido 3 y tenemos descifrado el texto.

Este texto ha sido extraído de Memorias de un nómada, de Paul Bowles. 



EJEMPLO DE CIFRADO HECHO EN JAVA

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class CifradoCesar {

    static String charMin = "abcdefghijklmnopqrstuvwxyz";
    static String charMay = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    
    public static void main(String[] args){
        try {
        String texto = "";
        int n = 0;
        System.out.println("Texto a cifrar");
        texto = bf.readLine();
        System.out.println("Desplazamiento para el cifrado.(numero entero)");
        n = Integer.parseInt(bf.readLine());
        System.out.println(n);
        System.out.println("Texto: "+texto);
        System.out.println("Texto cifrado: "+cifCesar(texto,n));
        } catch (Exception e) {
            System.out.print("Valor no valido.");
        }
    }
    private static String cifCesar(String entrada,int desp){
        String salida = "";
        for(int i = 0;i<entrada.length();i++){
       //  obtiene posicion de la entrada
            if((charMin.indexOf(entrada.charAt(i)) != -1) || (charMay.indexOf(entrada.charAt(i)) != -1)) 
                salida += (charMin.indexOf(entrada.charAt(i)) != -1) //lee letra por letra en vector si no es vacio
                               ? charMin.charAt(( (charMin.indexOf(entrada.charAt(i)) )+desp) %charMin.length() )
                                                : charMay.charAt(( charMay.indexOf(entrada.charAt(i)) +desp)%charMay.length());
            else
                salida += entrada.charAt(i);
        }
        return salida;
    }

} --------------------Configuration: <Default>--------------------
Texto a cifrar
ejemplo de cifrado
Desplazamiento para el cifrado.(numero entero)
3
Texto: ejemplo de cifrado
Texto cifrado: hmhpsor gh fliudgr


Process completed.