2011-08-01 12 views
14

Cuando ejecuto este código en Android no produce errores, pero cuando lo ejecuto en un programa Java estándar produce la excepción: java.security.InvalidKeyException: Tamaño de clave ilegal.java.security.InvalidKeyException: Tamaño de clave ilegal

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
SecretKeySpec keySpec = new SecretKeySpec(CHUNK_ENCRYPTION_KEY.getBytes(), 0, 32, "AES"); 
IvParameterSpec initVector = new IvParameterSpec(AES_INITIALIZATION_VECTOR.getBytes(), 0 , 16); 
cipher.init(Cipher.ENCRYPT_MODE, keySpec, initVector); 

CHUNK_ENCRYPTION_KEY es una clave de 32 bytes en forma fija en el programa. AES_INITIALIZATION_VECTOR es un vector de inicialización de 16 bytes codificado.

¿Alguien sabe por qué funcionaría en Android y no en un escritorio?

+0

Su pregunta se está perdiendo un signo de interrogación. – Snicolas

+0

@Hank Me estoy enfrentando un problema similar. ¿Has resuelto esto o no? – NovusMobile

+0

No, nunca pude resolver este – Hank

Respuesta

-1

Tal vez su vector de inicialización y llave suministrado no tenga 32 bytes, respectivamente 16 bytes de longitud. También puede tratar de utilizar los constructores que no toman los parámetros del desplazamiento y la longitud de las claves:

SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES"); 
    IvParameterSpec ivSpec = new IvParameterSpec(iv); 
+0

Comprobé la longitud de los bytes al convertir a las matrices de bytes, y si no hago el desplazamiento y la longitud, produce la misma excepción. – Hank

+0

¿está convirtiendo una Cadena Hex a bytes? –

+0

sí, toda la cadena de teclas consta de 32 caracteres Unicode. – Hank

24

En una instalación JVM escritorio por defecto (usando el JRE o JDK de Sun/Oracle), AES es limitado a un tamaño de clave de 128 bits. Este es un remanente de las leyes de importación/exportación de software criptográfico. Para desbloquear los tamaños de clave AES más grandes, debe descargar y aplicar los "Archivos de política de jurisdicción de fuerza ilimitada de JCE" (consulte al final de this page).

La restricción de tamaño de la clave se aplica por el código dentro de la clase Cipher. El cambio de proveedores criptográficos (por ejemplo, a uno de los proveedores de Bouncy Castle o IAIK) no le permitirá eludir esta restricción.

En una nota relacionada, que no quieren utilizar el método prima getBytes() en un String, ya que el resultado depende de la localización actual (no todo el mundo utiliza codificaciones UTF-8 o incluso compatible con ASCII). Si desea representar su clave como una cadena literal, al menos use una codificación explícita, como por ejemplo: CHUNK_ENCRYPTION_KEY.getBytes("UTF-8")

1

No se indica claramente en README que los "Archivos de política de jurisdicción de fuerza ilimitada de JCE" se deben copiar a jre dentro de su JDK, de lo contrario no funcionaría. La ruta de acceso de los archivos debe ser: /path/to/jdk1.7.0_xx/jre/lib/security

Cuestiones relacionadas