2010-10-31 1870 views
5

我正在做一个关于使用河豚做加密的任务& java解密。如何解决javax.crypto.IllegalBlockSizeException:数据不是块大小对齐

我已经添加了一个提供程序,并获得实例“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) 

谢谢。

+0

使用填充工作给你,你可以请分享固定的代码? – Shivam657 2017-07-25 10:14:38

回答

9

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

此外,这是一个块密码,所以输入必须是块长度的倍数。在加密提供者没有填充的情况下,你需要确保你的输入是块大小的倍数,否则加密/解密将不可能,你会得到这个错误。

因此,你必须为了两个选项来解决这个问题:

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

您能否分享固定和工作代码? – Shivam657 2017-07-25 10:13:59

+0

@ Shivam657:没有“代码”。这个问题是关于这个例外的潜在原因,我已经解释了这个答案的含义。假设你有同样的问题,你需要注意上面的信息,并根据它的当前结构将它集成到你的代码中。 – 2017-07-25 10:43:18

+0

好的,知道了,但是请你解释我如何找到标准块大小,我需要找到将输入填充到块大小的倍数。 – Shivam657 2017-07-25 11:59:09

3

您使用NoPadding和输入数据的大小必须不匹配密码的块大小,这样的IllegalBlockSizeException被抛出。如果您使用NoPadding,则需要确保您的输入是8个字节的倍数。

尝试指定填充方案。更改为Blowfish/CBC/PKCS5Padding,它应该工作。