Comportamiento criptográfico / AES predeterminado de Java

¿Alguien sabe para qué es el comportamiento criptográfico de Java predeterminado?

SecretKeySpec localSecretKeySpec = new SecretKeySpec(arrayOfByte, "AES"); Cipher localCipher = Cipher.getInstance("AES"); 

Específicamente, busco entender cómo esas clases generan el IV, así como también cuál es el modo de encriptación predeterminado cuando se especifica “AES”. Gracias.

Para Oracle JDK 7 (probado), el cifrado predeterminado para AES es AES / ECB / PKCS5Padding. La documentación de Java Security no menciona esto (http://docs.oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html#algspec), tiene que hacer algunas pruebas JUnit para averiguar .

Esos detalles son específicos del proveedor, y depender del modo predeterminado y el relleno puede ser muy peligroso. Si le interesan los valores que utiliza el proveedor predeterminado que se incluye actualmente con Java, deberá buscar el código fuente del algoritmo en cuestión. Por ejemplo, los valores predeterminados que usa para el algoritmo RSA están aquí . Además, la Guía de referencia de Java ™ Criptography Architecture (JCA) tiene bastante información que podría responder algunas de sus otras preguntas.

Los detalles son específicos del proveedor. La Guía de referencia de JCA dice que:

(Creación de un objeto de cifrado) Si no se especifica ningún modo o relleno, se utilizan los valores predeterminados específicos del proveedor para el modo y el esquema de relleno. Por ejemplo, el proveedor de SunJCE usa ECB como el modo predeterminado y PKCS5Padding como el esquema de relleno predeterminado para cifrados DES, DES-EDE y Blowfish. Esto significa que en el caso del proveedor de SunJCE: Cipher.getInstance (“DES”) y Cipher.getInstance (“DES / ECB / PKCS5Padding”) son declaraciones equivalentes.

Siempre usaría la forma completa (algoritmo / modo / relleno), no solo porque creo que omitir tales “detalles” para la implementación es una mala práctica, sino también para lograr un texto cifrado que sea independiente del proveedor elegido (uno generalmente encripta para almacenamiento / transmisión, entonces no se puede estar seguro de que el mismo proveedor se utilizará más adelante / en el otro extremo).

Depende de los proveedores. Diferentes proveedores pueden tener diferentes parámetros predeterminados. Este es el enlace para Java 8.

https://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html#SUNProvider

El método de fábrica javax.crypto.Cincher.getInstance (Transformación de cadena) genera Cifrados usando transformaciones del algoritmo / modo / relleno de forma. Si se omite el modo / relleno, los proveedores de SunJCE y SunPKCS11 usan ECB como el modo predeterminado y PKCS5Padding como el relleno predeterminado para muchos cifrados simétricos.

Se recomienda utilizar transformaciones que especifiquen por completo el algoritmo, el modo y el relleno en lugar de confiar en los valores predeterminados.

Nota: El BCE funciona bien para bloques de datos individuales y se puede paralelizar, pero generalmente no se debe usar para múltiples bloques de datos.

Por lo tanto, no solo debe usar AES, sino también especificar el modo y el relleno. Además, aunque el método getInstance podría tener otro parámetro para el proveedor, esto no se recomienda porque

las aplicaciones están vinculadas a proveedores específicos que pueden no estar disponibles en otras implementaciones de Java