I am doing an assignment about use blowfish to do encryption & decryption in java.
I had added a provider, and get instance "Blowfish/ECB/NoPadding", but I still get this error when I do the encryption.
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;
}
}
leads to
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)
Thank you.
You've explicitly asked for a provider that doesn't do padding (notice the NoPadding
in the instance name). Consequently, your input will not be padded.
Furthermore, this is a block cipher, so the input must be a multiple of the block length. With the crypto provider not doing padding, you need to ensure yourself that your input is a multiple of the block size, else encryption/decryption will not be possible and you'll get this error.
Thus you have two options in order to solve this:
PKCS5Padding
), if you don't want to do it manually. Given the nature of your question, this is likely to be the best option.You are using NoPadding
and the size of your input data must not match the block size of the cipher, so an IllegalBlockSizeException
is being thrown. If you use NoPadding you need to make sure that your input is a multiple of 8 bytes.
Try specifying a padding scheme. Change to Blowfish/CBC/PKCS5Padding
and it should work.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With