2010-10-31 16 views
5

Estoy haciendo una tarea sobre el uso de blowfish para hacer cifrado & descifrado en Java.Cómo solucionar javax.crypto.IllegalBlockSizeException: datos no bloqueados tamaño

He añadido un proveedor y obtengo la instancia "Blowfish/ECB/NoPadding", pero sigo teniendo este error cuando realizo el cifrado.

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 

ej .:

public static byte[] encrypt(byte to_encrypt[], byte strkey[]) { 
    try {   
     SecretKeySpec key = new SecretKeySpec(strkey, "Blowfish"); 
     Cipher cipher = Cipher.getInstance("Blowfish/ECB/NoPadding"); 
     cipher.init(Cipher.ENCRYPT_MODE, key); 
     return cipher.doFinal(to_encrypt); // <=========== error 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

lleva a

javax.crypto.IllegalBlockSizeException: data not block size aligned 
    at org.bouncycastle2.jce.provider.JCEBlockCipher.engineDoFinal(JCEBlockCipher.java:686) 
    at javax.crypto.Cipher.doFinal(Cipher.java:1171) 

Gracias.

+0

Si utilizó el relleno para usted, ¿podría compartir el código fijo? – Shivam657

Respuesta

9

Ha solicitado explícitamente un proveedor que no usa el relleno (observe el NoPadding en el nombre de la instancia). En consecuencia, su entrada no será acolchada.

Además, este es un cifrado de bloque, por lo que la entrada debe ser un múltiplo de la longitud del bloque. Con el proveedor de cifrado que no hace el relleno, debe asegurarse de que su entrada sea un múltiplo del tamaño del bloque, de lo contrario no será posible el cifrado/descifrado y obtendrá este error.

Por lo tanto, tiene dos opciones con el fin de resolver este:

  1. cojín de la entrada a sí mismo a un múltiplo del tamaño de bloque.
  2. Elija un proveedor que tenga relleno (por ejemplo, PKCS5Padding), si no desea hacerlo manualmente. Dada la naturaleza de su pregunta, esta es probablemente la mejor opción.
+0

¿Podría compartir el código fijo y de trabajo? – Shivam657

+0

@ Shivam657: No hay "el código". Esta pregunta fue sobre los motivos subyacentes de la excepción, y expliqué lo que significa en esta respuesta. Suponiendo que tiene el mismo problema, debe tomar nota de la información anterior e integrarla en su código de acuerdo con su estructura actual. –

+0

Está bien, lo tengo, pero podría explicar cómo encuentro el tamaño de bloque estándar, necesito encontrarlo para rellenar la entrada a un múltiplo del tamaño del bloque. – Shivam657

3

está usando el NoPadding y el tamaño de los datos de entrada no debe coincidir con el tamaño de bloque del sistema de cifrado, por lo que se está lanzando un IllegalBlockSizeException. Si utiliza NoPadding, debe asegurarse de que su entrada sea un múltiplo de 8 bytes.

Intente especificar un esquema de relleno. Cambie a Blowfish/CBC/PKCS5Padding y debería funcionar.

Cuestiones relacionadas