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

Publicado el mar 23 agosto 2011

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).