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