Java JCE : IllegalBlockSize Exception

Hi guyz,
  Could somebody please help me out with this........I cant for the life of me figure out why an IllegalBlockSize Exeception is being thrown.........



package Crypto;

import java.security.*;
import javax.crypto.*;
import sun.misc.*;

public class KryptonTest {
   
   
   
public static void main (String[] args) throws Exception {
    String ClearText = "dazzman123";
    System.out.print("Attempting to get a Blowfish key");
    KeyGenerator keyGenerator = KeyGenerator.getInstance("Blowfish");
    keyGenerator.init(128);
    SecretKey key = keyGenerator.generateKey();
    System.out.println("OK");
   
    System.out.print("Attempting to get a cipher and encrypt");
    Cipher cipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, key);
    byte [] cipherText = cipher.doFinal(ClearText.getBytes("ASCII"));
           
    String playitbaby = cipherText.toString();
    System.out.println(playitbaby);
   

   
    byte [] decrypted = playitbaby.getBytes("ASCII");
   
     
    cipher.init(Cipher.DECRYPT_MODE, key);
   
   
    byte [] decryptedtext = cipher.doFinal(decrypted);


   
    String output = decryptedtext.toString();
   
    System.out.println (output);
 
   
    System.out.println("Test Completed Successfully");
----------------------------------------------------------------------------




Attempting to get a Blowfish keyOK
Attempting to get a cipher and en
javax.crypto.IllegalBlockSizeException: Input length (with padding) not multiple of 8 bytes
        at com.sun.crypto.provider.BlowfishCipher.a(DashoA6275)
        at com.sun.crypto.provider.BlowfishCipher.engineDoFinal(DashoA6275)
        at com.sun.crypto.provider.BlowfishCipher.engineDoFinal(DashoA6275)
        at javax.crypto.Cipher.doFinal(DashoA6275)
        at Crypto.KryptonTest.main(KryptonTest.java:60)crypt[B@5d56d5
 
dazz_manAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

savalouCommented:
You should decrypt cipherText, not playitbaby.

cipherText.toString() isn't going to give you a string representation of the array, that gives you the object reference of the array.   Your encrypted message is not text, it's binary and may not be printable text.  If you want to know what the bytes are, print them out one-by-one in a for loop and you'd have some idea.

0
savalouCommented:
Sorry, decrypt cipherText, not decrypted.

So
 byte [] decryptedtext = cipher.doFinal(decrypted); // no
becomes
 byte [] decryptedtext = cipher.doFinal(cipherText); //
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
AnanthalakshmiCommented:
Hi,
Visit http://forum.java.sun.com/thread.jsp?thread=454515&forum=9&message=2075112.

The following is an extract from the above site.

========================================================
IllegalBlockSize is the result of not using padding and or providing an invalid input length.

DES is a block cipher which requires at least 8 bytes of data and a total divisable by 8 bytes. That is unless you use a padding scheme which ensures it is a multiple of 8 bytes.

AES has a 16 byte block size. It must have 16 bytes of data input to do a single crypt operation. Total input length must be a multiple of 16 bytes.

The easiest way to deal with this is to use padding. PKCS5Padding as an example. Now padding will result in your output ciphertext being larger than your input plaintext (because of the pad bytes) but it will ensure you never get that error. Another solution is to use a stream mode such as CFB8 or CTR mode. This does not require padding and allows a block cipher such as DES, DESede, AES, etc to behave like a stream cipher. (aka doesn't care how much input you give it)... And finally, you can use a Stream cipher. Something like RC4 for example.

============================================================

Thanks,
H.Ananthalakshmi.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Java

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.