Link to home
Start Free TrialLog in
Avatar of MaritimeSource
MaritimeSource

asked on

java crypto - BadPaddingException

Hi,

I have a problem with encrypting/decrypting. Strangely enough the program is able to encrypt/decrypt for a few days, then it starts to fail on the decryption.

Here is the code:


public class DesEncrypter {
    Cipher ecipher;
    Cipher dcipher;

    // 8-byte Salt
    byte[] salt = {
        (byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,
        (byte)0x56, (byte)0x35, (byte)0xE3, (byte)0x03
    };
   
    // Iteration count
    int iterationCount = 19;
   
    public final static String passPhrase = "b@a0b@r3f3er1adfgrg";
   
    public DesEncrypter() {
        try {
            // Create the key
            KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
            SecretKey key = SecretKeyFactory.getInstance(
                "PBEWithMD5AndDES").generateSecret(keySpec);
            ecipher = Cipher.getInstance(key.getAlgorithm());
            dcipher = Cipher.getInstance(key.getAlgorithm());

            // Prepare the parameter to the ciphers
            AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);

            // Create the ciphers
            ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
            dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
        } catch (java.security.InvalidAlgorithmParameterException e) {
        } catch (java.security.spec.InvalidKeySpecException e) {
        } catch (javax.crypto.NoSuchPaddingException e) {
        } catch (java.security.NoSuchAlgorithmException e) {
        } catch (java.security.InvalidKeyException e) {
        }
    }

    public String encrypt(String str) {
        try {
            // Encode the string into bytes using utf-8
            byte[] utf8 = str.getBytes("UTF8");

            // Encrypt
            byte[] enc = ecipher.doFinal(utf8);

            // Encode bytes to base64 to get a string
            return new sun.misc.BASE64Encoder().encode(enc);
        } catch (javax.crypto.BadPaddingException e) {
        } catch (IllegalBlockSizeException e) {
        } catch (UnsupportedEncodingException e) {
        }
        return null;
    }

    public String decrypt(String str) {
        try {
            // Decode base64 to get bytes
            byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);

            // Decrypt
            byte[] utf8 = dcipher.doFinal(dec);

            // Decode using utf-8
            return new String(utf8, "UTF8");
        } catch (javax.crypto.BadPaddingException e) {
        } catch (IllegalBlockSizeException e) {
        } catch (UnsupportedEncodingException e) {
        } catch (java.io.IOException e) {
        }
        return null;
    }}

NOTE: I added some debug statements in each catch block above, and determined it's throwing the error in the decrypt for BadPaddingException, with the error "Given final block not properly padded".

One thing I noticed is I'm specifying "UTF8" but shouldn't that be "UTF-8" ? Why does the decyption work for awhile then starts failing?

I read through this post, but I still don't get it.

http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=65&t=000393

Thanks
Avatar of Siva Prasanna Kumar
Siva Prasanna Kumar
Flag of India image

>>decyption work for awhile then starts failing

When is it failing one you stop the program and then try decrypt the encrypted message in the next run????

actually according to me the whole problem is becuae of improper or inconsistent padding.

Avatar of MaritimeSource
MaritimeSource

ASKER

This is running in a web application environment... the web server doesn't stop at all during this time, which is the confusing part.

Thanks
ASKER CERTIFIED SOLUTION
Avatar of Siva Prasanna Kumar
Siva Prasanna Kumar
Flag of India image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial