java crypto - BadPaddingException

Posted on 2006-05-19
Last Modified: 2010-07-27

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(
            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 ( e) {
        } catch ( e) {
        } catch (javax.crypto.NoSuchPaddingException e) {
        } catch ( e) {
        } catch ( 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 ( 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.

Question by:MaritimeSource
    LVL 23

    Expert Comment

    >>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.


    Author Comment

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

    LVL 23

    Accepted Solution

    about that utf-8 utf8 the only difference with respect to a web app is that utf-8 is a strict version of the utf8 as you are using a utf8 which is fine.

    As its a web application and now the only thing you can do is just try logging the encrypted message and decrypted message and compare it with the same result prouded using a stand alone program.

    just use some system outs in the web application you will get the result on to the console or logs.

    and apply the same to the stand alone program.

    Write Comment

    Please enter a first name

    Please enter a last name

    We will never share this with anyone.

    Featured Post

    How your wiki can always stay up-to-date

    Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
    - Increase transparency
    - Onboard new hires faster
    - Access from mobile/offline

    Java contains several comparison operators (e.g., <, <=, >, >=, ==, !=) that allow you to compare primitive values. However, these operators cannot be used to compare the contents of objects. Interface Comparable is used to allow objects of a cl…
    Introduction This article is the first of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article explains our test automation goals. Then rationale is given for the tools we use to a…
    Video by: Michael
    Viewers learn about how to reduce the potential repetitiveness of coding in main by developing methods to perform specific tasks for their program. Additionally, objects are introduced for the purpose of learning how to call methods in Java. Define …
    Viewers will learn about if statements in Java and their use The if statement: The condition required to create an if statement: Variations of if statements: An example using if statements:

    759 members asked questions and received personalized solutions in the past 7 days.

    Join the community of 500,000 technology professionals and ask your questions.

    Join & Ask a Question

    Need Help in Real-Time?

    Connect with top rated Experts

    10 Experts available now in Live!

    Get 1:1 Help Now