/////////////////////////////////////////////////////////// // CRIPTOGRAFIA - Técnicas de desarrollo para profesionales /////////////////////////////////////////////////////////// // Capítulo 3: Criptografía en entornos Java // Sección 3.3: Codificación de encriptación simétrica /////////////////////////////////////////////////////////// // Listado 3.2: Ejemplo que evidencia cómo puede variar // la longitud de la salida de un cifrador con una entrada // de tamaño no múltiplo del block-size del algoritmo por // el padding. /////////////////////////////////////////////////////////// import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; public class EjemploLongitudSalida { public static void main(String[] args) throws Exception { // obtenemos un llave aleatoria KeyGenerator keygen = KeyGenerator.getInstance("AES"); SecretKey sKey = keygen.generateKey(); SecretKeySpec key = new SecretKeySpec(sKey.getEncoded(), "AES"); // creamos la instancia del cifrador Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC"); // defininimos nuestra entrada (23 bytes). byte[] entrada = "Contenido de prueba".getBytes(); // imprimimos cuánto mide la entrada System.out.println("Longitud de entrada: " + entrada.length + " bytes."); // encriptamos nuestra entrada teniendo en cuenta // lo retornado por update() y doFinal(), es decir // la cantidad de bytes procesados. Se utiliza el // método cipher.getOutputSize() para determinar // cuál será el tamaño del array en el cual se // registrará la información cifrada. cipher.init(Cipher.ENCRYPT_MODE, key); byte[] cifrado = new byte[cipher.getOutputSize(entrada.length)]; int cifrado_len = cipher.update(entrada, 0, entrada.length, cifrado, 0); cifrado_len += cipher.doFinal(cifrado_len, cifrado_len); // imprimimos cuánto mide la salida System.out.println("Longitud de texto-cifrado: " + cifrado_len + " bytes."); // ahora desencriptamos lo anterior cipher.init(Cipher.DECRYPT_MODE, key); byte[] texto_plano = new byte[cipher.getOutputSize(cifrado_len)]; int texto_plano_len = cipher.update(cifrado, 0, cifrado_len, texto_plano, 0); texto_plano_len += cipher.doFinal(texto_plano, texto_plano_len); // imprimimos cuánto mide el texto-plano descifrado System.out.println("Longitud de texto-plano: " + texto_plano_len + " bytes."); } }