如何解决javax.crypto.IllegalBlockSizeException:数据不是块大小对齐

我正在做一个关于使用blowfish在java中进行加密和解密的任务。

我添加了一个提供程序,并获取实例“Blowfish / ECB / NoPadding”,但在进行加密时仍然出现此错误。

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

例如:

 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; } } 

导致

 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) 

谢谢。

您已明确要求提供程序不执行填充(请注意实例名称中的NoPadding )。 因此,您的输入不会被填充。

此外,这是一个分组密码,因此输入必须是块长度的倍数。 由于加密提供程序没有执行填充,您需要确保自己的输入是块大小的倍数,否则加密/解密将无法进行,您将收到此错误。

因此,您有两个选择来解决此问题:

  1. 将输入自己填充到块大小的倍数。
  2. 如果您不想手动执行,请选择执行填充的提供程序(例如PKCS5Padding )。 鉴于您的问题的性质,这可能是最好的选择。

您正在使用NoPadding并且输入数据的大小必须与密码的块大小不匹配,因此抛出IllegalBlockSizeException 。 如果使用NoPadding,则需要确保输入是8字节的倍数。

尝试指定填充方案。 改为Blowfish/CBC/PKCS5Padding它应该可行。