Thursday, 16 April 2009

Cifrado AES (Advanced Encryption Standard)

Continuando con la línea del cifrado Blowfish, el AES es también uno de los más conocidos y populares. AES es un algoritmo de cifrado avalado y utilizado por el gobierno de los Estados Unidos. AES es utilizado para proteger información clasificada, sobretodo utilizada por organismos gubernamentales, también utilizado por el sector privado.
AES está basado en el algoritmo de cifrado Rijndael, nombre dado por los autores Vincent Rijmen y Joan Daemen.
En el capítulo 17 de la séptima temporada de 24h, aparece una puerta con lector de tarjeta, y esta tiene un código cifrado con AES, pues bien, aquí os muestro un poco como funciona este cifrado y alguna aplicación.

  • Las 4 partes principales de AES:

Transformación ByteSub
Esta capa no es lineal para la resistencia a los criptoanálisis diferencial y lineal.

Transformación ShiftRow

Esta mezcla o paso lineal causa difusión de los bits a través de múltiples rondas.

Transformación MixColumn

Esta capa tiene un propósito similar a ShiftRow.

AddRoundKey

La clave es XORed redondea con el resultado de la capa de arriba.


Un ejemplo más amplio, lo podemos encontrar en la web de eng.tau.ac.il, donde nos muestra una imagen muy interesante del funcionamiento del algoritmo:

  • Creando nuestras aplicaciones integrando AES:
Como ya comenté en el enlace del BlowFish, mediante la librería gnu-Crypto para java o DcpCrypt para Delphi, podemos integrar este algoritmo muy fácilmente en nuestras aplicaciones. Un ejemplo para Java lo podéis encontrar aquí:




import javax.crypto.*;
import javax.crypto.spec.*;

public class TestAES {
public static String asHex(byte[] buf) {
StringBuffer strbuf = new StringBuffer(buf.length * 2);
int i;

for (i = 0; i < buf.length; i++) {
if (((int) buf[i] & 0xff) < 0x10) {
strbuf.append("0");
}

strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
}

return strbuf.toString();
}

public static void main(String[] args) throws Exception {
String message = "This is just an example";
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);

SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

byte[] encrypted = cipher.doFinal(((args.length == 0)
? "This is just an example" : args[0]).getBytes());
System.out.println("encrypted string: " + asHex(encrypted));
cipher.init(Cipher.DECRYPT_MODE, skeySpec);

byte[] original = cipher.doFinal(encrypted);
String originalString = new String(original);
System.out.println("Original string: " + originalString + " " +
asHex(original));
}
}

El resultado de la ejecución de la aplicación es el siguiente:

encrypted string:
d2bd71b70149628467da121bbf59eac84e26ee0d70cf9b0d3d08b71336804e50
Original string:
This is just an example 54686973206973206a75737420616e206578616d706c65


También podemos encontrar cifradores on-line, por ejemplo en:
http://people.eku.edu/styere/Encrypt/JS-AES.html


  • Enlaces de interés:
http://es.tldp.org/LinuxFocus/pub/mirror/LinuxFocus/Castellano/May2002/article243.shtml
http://www.eng.tau.ac.il/%7Eyash/crypto-netsec/rijndael.htm
http://islab.oregonstate.edu/koc/ece575/03Project/Vu-Hong/
http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html

3 comments:

  1. oigan me pueden apoyar con este mismo ejemplo pero en una clase mobile

    ReplyDelete
  2. Disculpen que tengo que hacer para que esta clase funcione en mobile de ante mano muchas gracias

    ReplyDelete
    Replies
    1. Hola,

      No entiendo tu comentario. Este codigo deberia funcionar pero tienes que mirar que la clase criptox este disponible.

      Delete