java - 如何解决javax.crypto.IllegalBlockSizeException : data not block size aligned

标签 java

我正在做一个关于使用 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)。因此,您的输入不会被填充。

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

因此你有两个选择来解决这个问题:

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

关于java - 如何解决javax.crypto.IllegalBlockSizeException : data not block size aligned,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4062015/

相关文章:

java - 如何使用在所有平台上运行的 SWT 创建可执行 JAR?

java - 重构大型 JSON 多次调用

java - 如何在 apache poi 3.17 中调用 trackAllColumnsForAutoSizing() 方法

java - 在 git checkout 之后在 eclipse 中包含文件

java - 如何在 FreeMarker 中显示日历类型数据

java - 使用 "*"的字符串拆分题

java - 打印具有正确格式的二叉搜索树

java - 在 java 中为 jTabbedPane 的选项卡设置光标

java - hibernate :Save Parent automatically before saving Child

java - 检查输入是否在 ArrayList 中