Debemos tener en cuenta que para hacer esta encriptación, podemos usar clases propias de la JDK o alguna librería de utilidad. Nosotros vamos a usar la librería 'bouncy castle' (artifactId: bcprov-jdk16 y versión: 1.46).
Pero para empezar debemos tener unos cuantos conceptos claros:
- ¿Que es AES? Un algoritmo de cifrado de datos en bloques (tan grandes como el tamaño de su contraseña, que es como mínimo de 128 bits). El estándar desde comienzos del siglo.Más info aquí.
- Llave: Para poder encriptar y desencriptar, el algoritmo necesita una llave (o contraseña) conocida por los sistema a interactuar. Esta llave debe tener el mismo tamaño que los bloques del cifrado.
El funcionamiento a la hora de des/encriptar es exactamente igual, lo único que varía es la forma de crear el objeto que nos permite la des/encriptación. Si queremos que encripte pasaremos como parámetro de entrada 'true' y si queremos que desencripte, pasaremos 'false'.
boolean modoEncriptacion = true; // true encriptar:, false: desencriptar byte[] llaveBytes = llave.getBytes(); // 'llave' es la contraseña para realizar la encriptacion PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new AESEngine()); cipher.init(modoEncriptacion, new KeyParameter(llaveBytes));
La des/encriptación funciona con array de bytes, por tanto tanto la contraseña como el texto a des/encriptar debemos pasarlo a un array de bytes. La lógica es bastante sencilla:
- Debemos crear un buffer de salida cuyo tamaño nos lo puede decir el propio 'cipher' con 'getOutputSize'.
- Copiar los datos des/encriptado del array de bytes a des/encriptar hacía el de salida. Indicando los bytes a copiar (lo normal es de 0 al máximo de tamaño del buffer de salida)
- Procesar los bytes finales que se han podido quedar sin copiar en el buffer de salida. Importante: Indicar a partir de que punto debe seguir obteniendo datos (a partir del byte que el último byte que haya procesado el método anterior).
private static byte[] cipherData(final PaddedBufferedBlockCipher cipher, final byte[] data) throws Exception { int minSize = cipher.getOutputSize(data.length); byte[] outBuf = new byte[minSize]; int bytesProcesados1 = cipher.processBytes(data, 0, data.length, outBuf, 0); int bytesProcesados2 = cipher.doFinal(outBuf, bytesProcesados1); int tamanyoTotal = bytesProcesados1 + bytesProcesados2; byte[] resultado = new byte[tamanyoTotal]; System.arraycopy(outBuf, 0, resultado, 0, tamanyoTotal); return result; }
Ejemplo completo de des/encriptación:
PaddedBufferedBlockCipher encryptCipher = new PaddedBufferedBlockCipher(new AESEngine()); encryptCipher.init(true, new KeyParameter(llaveBytes)); byte[] result = cipherData(encryptCipher, aEncriptarBytes); PaddedBufferedBlockCipher decryptCipher = new PaddedBufferedBlockCipher(new AESEngine()); decryptCipher.init(false, new KeyParameter(llaveBytes)); byte[] encodedBytes = Base64.decode(encoded.getBytes()); result = cipherData(decryptCipher, encodedBytes);
No hay comentarios:
Publicar un comentario