martes, 17 de enero de 2012

Criptografía simétrica y asimétrica

La criptografía se usa para ntercambiar mensajes que sólo puedan ser leídos por usuarios a las que van dirigidos y que poseen los medios para descifrarlos.

Mediante una clave secreta, ciframos un mensaje y después podemos descrifrar el mensaje con la misma clave u otra distinta. De esta forma hay dos tipos de algoritmos, según cantidad de claves:
  • Critografía simétrica
  • Criptografía asimétrica
Ahora os voy a explicar brevemente cada uno y al final tenéis una comparativa entra las dos.

 Criptografía simétrica

Se usa una única clave para cifrar y descifrar los mensajes. Las dos partes tienen que ponerse de acuerdo de antemano.

Criptografía asimétrica

La criptografía asimétrica usa dos claves para el envío de mensajes: una clave pública y una clave privada.

Cada usuario tiene una clave pública y una privada que son propias. El usuario debe mantener en secreto la privada y distribuir la pública a todos los receptores con los que desea comunicarse.
En este sistema, lo que cifra la clave pública sólo puede ser descifrado con la privada y lo que cifra la clave privada sólo lo descifra la pública.

El funcionamiento es el siguiente:

Criptografía asimétrica paso 1
Los usuarios que quieren comunicarse con el usuario 1, le piden su clave pública y éste les envía.

Criptografía asimétrica paso 2
Estos usuarios, encriptan el mensaje usando la clave pública y envían el mensaje al usuario 1. El usuario 1 desencriptará los mensaje usando su clave privada. EL usuario 1 será el único que podrá leer el mensaje enviado por usuarios 3 y 4 puesto que el usuario 1 es el único con la clave privada 1.
Criptografía asimétrica paso 3
Si se desea tener una conversación segura entre dos usuarios, primero tendrán que intercambiar sus claves públicas y después usarán esta claves para encriptar los mensajes.

Aquí os muestro una tabla con las ventajas y desventajas de los dos algoritmos:

Comparación criptografía asimétrica y simétrica
Aquí os dejo código Java que encripta un mensaje con el método XOR. EL método recibe el texto a encriptar y la clave con la que se quiere encriptar. Para desencriptar el mensaje lo único que tenemos que hacer es volver a utilizar el método pero metiendo el texto encriptado en el lugar del mensaje original.

public class Encriptador {
   public static final String DEFAULT_ENCODING="UTF-8"; 
   static BASE64Encoder enc=new BASE64Encoder();
   static BASE64Decoder dec=new BASE64Decoder();

   public static String base64encode(String text){
      try {
         String rez = enc.encode( text.getBytes( DEFAULT_ENCODING ) );
         return rez;         
      }
      catch ( UnsupportedEncodingException e ) {
         return null;
      }
   }

   public static String base64decode(String text){

         try {
            return new String(dec.decodeBuffer( text ),DEFAULT_ENCODING);
         }
         catch ( IOException e ) {
           return null;
         }

      }

      public static void main(String[] args){
       String txt="Texto para encriptar" ;
       String key="clave";
       System.out.println(txt+" con XOR es: "+(txt=xorMessage( txt, key )));
       String encoded=base64encode( txt );       
       System.out.println( " codificado en: "+encoded+" y esto se decodifica en: "+ (txt=base64decode( encoded )));
       System.out.print( "Mensaje original conseguido aplicando XOR: "+xorMessage( txt, key ) );

      }

      public static String xorMessage(String message, String key){
       try {
          if (message==null || key==null ) return null;

         char[] keys=key.toCharArray();
         char[] mesg=message.toCharArray();

         int ml=mesg.length;
         int kl=keys.length;
         char[] newmsg=new char[ml];

         for (int i=0; i<ml; i++){
            newmsg[i]=(char)(mesg[i]^keys[i%kl]);
         }//for i
         mesg=null; keys=null;
         return new String(newmsg);
      }
      catch ( Exception e ) {
         return null;
       }  
      }
}

No hay comentarios:

Publicar un comentario