logo principal

Cifrado simétrico en Java

Vamos a ver como encriptar y desencriptar de forma asimétrica texto o archivos en Java. Este tipo de cifrado consiste en usar una única clave, que se utilizara tanto para cifrar como descifrar los datos.

criptografia

Para utilizar este tipo de cifrado en Java vamos a utilizar la clase KeyGenerator. Esta clase nos permite generar una llave, que será la que utilizaremos para el encriptado y desencriptado.

A continuación vamos a hacer un pequeño programa que nos va a permitir encriptar y desencriptar una cadena de texto usando una llave generada usando la clase mencionada anteriormente.

Lo primero que haremos es crear un objeto de tipo KeyGenerator utilizando el algoritmo AES, generando una llave y declarando una cadena de texto que vamos a utilizar para el proceso de encriptado.



/*  Creamos el objeto SecureRandom, que nos permite generar números aleatorios 
*   de manera segura y posteriormente creamos el objeto KeyGenerator utilizando
*   el método estático getInstance(), pasandolo como parámetro el tipo de 
*   algoritmo que vamos a utilizar, en este caso será AES
*/
SecureRandom sr = new SecureRandom();
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");

/*  Especificamos el tamaño de la llave en bits y le pasamos el objeto SecureRandom,
*   que permitirá generar la clave aleatoria de forma segura.
*/
keyGenerator.init(256, sr);

//  Generamos la llave
SecretKey key = keyGenerator.generateKey();

String msg = "Mensaje para encriptar y posteriormente desencriptar";


                

Lo siguiente que vamos a hacer es crear 2 métodos, uno se encargará de encriptar y el otro de desencriptar. Estos metodos utilizarán la clase Cipher para realizar la tarea de cifrado.



public static byte[] encriptar(byte[] inputBytes, SecretKey key, String algorithm){
    
    try {
        /*  Utilizamos el metodo estático getInstance() especificando el tipo de algoritmo que
        *   vamos a usar para crear el objeto, que será AES.
        */ 
        Cipher cipher = Cipher.getInstance(algorithm);

        //  Inicializamos el cipher en modo de encriptado y pasamos la llave
        cipher.init(Cipher.ENCRYPT_MODE, key);

        /*  Por último le pasamos el texto en bytes, y nos devolverá el texto encriptado
        *   en bytes
        */
        return cipher.doFinal(inputBytes);
        
    }  catch (Exception ex) {
        System.out.print(ex);
    }

    return null;

}

public static byte[] desencriptar(byte[] inputBytes, SecretKey key, String algorithm){
    
    try {

        Cipher cipher = Cipher.getInstance(algorithm);

        //  Inicializamos el cipher en modo de desencriptado y pasamos la llave
        cipher.init(Cipher.DECRYPT_MODE, key);
        return cipher.doFinal(inputBytes);
        
    }  catch (Exception ex) {
        System.out.print(ex);
    }

    return null;

}

                

Una vez creados los métodos ya podemos proceder probar el encriptado y desencriptado de nuestro mensaje de prueba.



System.out.println("Texto sin encriptar -> " + msg);

byte[] msgEncryptedBytes = encriptar(msg.getBytes(), key, key.getAlgorithm());
System.out.println("Texto encriptado -> " + new String(msgEncryptedBytes));

byte[] msgDecryptedBytes = desencriptar(msgEncryptedBytes, key, key.getAlgorithm());
System.out.println("Texto desencriptado -> " + new String(msgDecryptedBytes));            

                

Atención: Convertir datos encriptados de bytes a String no es una buena práctica ya que se puede perder información o corromper los datos en el proceso.

A continuación dejaré el código completo de la clase creada.

Código completo.