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
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:
Los usuarios que quieren comunicarse con el usuario 1, le piden su clave pública y éste les envía.
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.
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:
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