【问题标题】:How to solve javax.crypto.IllegalBlockSizeException: data not block size aligned如何解决 javax.crypto.IllegalBlockSizeException:数据未对齐块大小
【发布时间】:2011-05-02 23:58:04
【问题描述】:

我正在做一个关于使用河豚在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)

谢谢。

【问题讨论】:

  • 使用填充对你有用吗,你能分享一下固定的代码吗?

标签: java


【解决方案1】:

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

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

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

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

【讨论】:

  • @Shivam657:没有“代码”。这个问题是关于异常的根本原因,我已经在这个答案中解释了它的含义。假设你遇到了同样的问题,你需要记下上面的信息,并根据它当前的结构将它集成到你的代码中。
  • 好的,知道了,但是请您解释一下如何找到标准块大小,我需要找到它以将输入填充为块大小的倍数。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-09-26
    • 2015-06-14
    • 2023-04-06
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多