我正在做一个关于使用 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 大小的倍数,否则加密/解密将无法进行,您将收到此错误。
因此你有两个选择来解决这个问题:
- 自己将输入填充为 block 大小的倍数。
- 如果您不想手动执行填充,请选择执行填充的提供程序(例如
PKCS5Padding
)。考虑到您问题的性质,这可能是最佳选择。
关于java - 如何解决javax.crypto.IllegalBlockSizeException : data not block size aligned,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4062015/