我正在做一个关于使用河豚进行加密的任务。在java中解密。
我添加了一个提供程序,并获取实例“Blowfish / ECB / NoPadding”,但是当我进行加密时仍然会出现此错误。
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
e.g:
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 :(得分:9)
您已明确要求提供程序不执行填充(请注意实例名称中的NoPadding
)。因此,您的输入不会被填充。
此外,这是一个分组密码,因此输入必须是块长度的倍数。由于加密提供程序没有填充,您需要确保输入是块大小的倍数,否则加密/解密将无法进行,您将收到此错误。
因此,您有两个选择来解决这个问题:
PKCS5Padding
)。鉴于您的问题的性质,这可能是最好的选择。答案 1 :(得分:3)
您正在使用NoPadding
,并且输入数据的大小必须与密码的块大小不匹配,因此会抛出IllegalBlockSizeException
。如果使用NoPadding,则需要确保输入是8字节的倍数。
尝试指定填充方案。更改为Blowfish/CBC/PKCS5Padding
,它应该有效。