2011-06-06 6 views
24

¿Alguien sabe cuál es el Java comportamiento de cifrado por defecto es para:por defecto de Java comportamiento Crypto/AES

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

Específicamente Busco entender cómo esas clases generan el IV, así como lo es el modo de cifrado por defecto cuando solo se especifica "AES". Gracias.

+2

Prohibida sobre esto, pero podría depender muy fácilmente del proveedor. Realmente desea especificar siempre tanto el modo de operación como el algoritmo de relleno. De lo contrario, puede causar muchos problemas ... –

+3

¿De verdad podría aceptar una de estas respuestas? Su última pregunta es no hace mucho tiempo, por lo que debería estar todavía. –

Respuesta

10

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 utiliza para el algoritmo RSA son here. Además, el Java™ Cryptography Architecture (JCA) Reference Guide tiene bastante información que podría responder algunas de sus otras preguntas.

26

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 .

+3

Puedo confirmar que 1.6.0_31 también usa 'AES/ECB/PKCS5Padding' cuando solo se solicita' AES'. Probado encriptando ~ 10MB de '/ dev/urandom' varias combinaciones. – Jesse

+1

¡He estado buscando esto por horas! ¡Gracias! –

+1

@Jesse - 'Cipher.getAlgorithm()' debe devolver lo que está usando. Consulte la [Documentación de nombre de algoritmo estándar de Java] (http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html). – jww

9

Los detalles son específicos del proveedor. El JCA Reference Guide dice que:

(Creación de un objeto de cifrado) Si no se especifica ningún modo o de relleno, se utilizan los valores por defecto específicos del proveedor para el modo y 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.

yo siempre utilizar la forma completa (algoritmo/modo/relleno), no sólo porque creo que dejando de lado esos "detalles" para la puesta en práctica es una mala práctica, sino también para lograr un texto cifrado que es independiente de el proveedor elegido (uno generalmente encripta para almacenamiento/transmisión, entonces uno no puede estar seguro de que el mismo proveedor será utilizado más adelante/en el otro extremo).

0

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

La fábrica javax.crypto.Cipher.getInstance (String transformación) método genera Cifrados utilizando transformaciones de la forma algoritmo/modo/relleno. Si se omite el modo/relleno, los proveedores 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 de en lugar de confiar en los valores predeterminados.

Nota: ECB funciona bien para bloques de datos individuales y puede ser paralelizado, pero generalmente no se debe utilizar para varios bloques de datos .

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

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

Cuestiones relacionadas