martes, 23 de agosto de 2011

Cifrado/Decifrado con AES y llave simétrica en Java

Encriptar y desencriptar con AES y llave simétrica. En este caso se emplea AES-256, por lo que deberemos tener una clave de largo 32 (32 * 8 = 256).
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class Probador {

 public static void main(String[] args) {
  // llaveSimetrica es un String de largo múltiplo de 8
  // en este caso si es de largo 32 nos permite AES-256 (32 * 8)
  String llaveSimetrica = "holamundocruel12holamundocruel12";
  
  SecretKeySpec key = new SecretKeySpec(llaveSimetrica.getBytes(), "AES");
  Cipher cipher;
  try {
   cipher = Cipher.getInstance("AES");
   
   //Comienzo a encriptar
   cipher.init(Cipher.ENCRYPT_MODE, key);
   byte[] campoCifrado = cipher.doFinal("mensaje_secreto".getBytes());
   /*
    * TODO: Representar los bytes como string vía base64, así será
    * humanamente leíble. La otra opción es expresar como hexadecimal
    * 
    * En este caso lo imprimo en pantalla como bytes.
    */
   System.out.println(new String(campoCifrado));
  
   //Comienzo a desencriptar
   cipher.init(Cipher.DECRYPT_MODE, key);
   byte[] datosDecifrados = cipher.doFinal(campoCifrado);
   String mensaje_original = new String(datosDecifrados); 
   System.out.println(mensaje_original);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}
Actualización 19/04/2013:
Olvidé indicar que para emplear criptografía fuerte, por ejemplo AES-256, deben instalar Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files.
En caso que no deseen hacerlo, pueden usar el ejemplo anterior con AES-128, la cual emplea una llave de largo 16 (16*8 = 128).

4 comentarios:

Alvaro Lopez dijo...

Hola amigo, gracias por el código, tengo un problema con ello, me da el error java.security.InvalidKeyException: Illegal key size or default parameters... espero que me puedas ayudar. Gracias!

Eduardo Villagrán Morales dijo...

Alvaro,
lo que sucede es que tu librería de criptografía Java no soporta encriptación fuerte (AES > 128).

to run encryption stronger than 128-bit you will need to download and install 'Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6' from http://www.oracle.com/technetwork/java/javase/downloads/index.html.

Si no quieres usar JCE,necesitas una llave de largo 16 caracteres (8*16 = 128).

juande dijo...

hola que pena se pueden cifrar archivos del tamaño de 1 gb o mas?

Paulito dijo...

Para que no te de el error de java.security.InvalidKeyException: Illegal key size or default parameters, puedes usar esta clave String llaveSimetrica = "FBkrugerQ!p0W"+"\""+"09";