?
Solved

java crypto - BadPaddingException

Posted on 2006-05-19
4
Medium Priority
?
934 Views
Last Modified: 2010-07-27
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
0
Comment
Question by:MaritimeSource
  • 2
3 Comments
 
LVL 23

Expert Comment

by:Siva Prasanna Kumar
ID: 16726580
>>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.

0
 

Author Comment

by:MaritimeSource
ID: 16726597
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
0
 
LVL 23

Accepted Solution

by:
Siva Prasanna Kumar earned 1500 total points
ID: 16726619
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.
0

Featured Post

Hire Technology Freelancers with Gigs

Work with freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely, and get projects done right.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

INTRODUCTION Working with files is a moderately common task in Java.  For most projects hard coding the file names, using parameters in configuration files, or using command-line arguments is sufficient.   However, when your application has vi…
Basic understanding on "OO- Object Orientation" is needed for designing a logical solution to solve a problem. Basic OOAD is a prerequisite for a coder to ensure that they follow the basic design of OO. This would help developers to understand the b…
This tutorial covers a practical example of lazy loading technique and early loading technique in a Singleton Design Pattern.
This tutorial covers a step-by-step guide to install VisualVM launcher in eclipse.
Suggested Courses
Course of the Month14 days, 1 hour left to enroll

807 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