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.toCh arArray(), salt, iterationCount);
SecretKey key = SecretKeyFactory.getInstan ce(
"PBEWithMD5AndDES").genera teSecret(k eySpec);
ecipher = Cipher.getInstance(key.get Algorithm( ));
dcipher = Cipher.getInstance(key.get Algorithm( ));
// Prepare the parameter to the ciphers
AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);
// Create the ciphers
ecipher.init(Cipher.ENCRYP T_MODE, key, paramSpec);
dcipher.init(Cipher.DECRYP T_MODE, key, paramSpec);
} catch (java.security.InvalidAlgo rithmParam eterExcept ion e) {
} catch (java.security.spec.Invali dKeySpecEx ception e) {
} catch (javax.crypto.NoSuchPaddin gException e) {
} catch (java.security.NoSuchAlgor ithmExcept ion e) {
} catch (java.security.InvalidKeyE xception 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().e ncode(enc) ;
} catch (javax.crypto.BadPaddingEx ception e) {
} catch (IllegalBlockSizeException e) {
} catch (UnsupportedEncodingExcept ion e) {
}
return null;
}
public String decrypt(String str) {
try {
// Decode base64 to get bytes
byte[] dec = new sun.misc.BASE64Decoder().d ecodeBuffe r(str);
// Decrypt
byte[] utf8 = dcipher.doFinal(dec);
// Decode using utf-8
return new String(utf8, "UTF8");
} catch (javax.crypto.BadPaddingEx ception e) {
} catch (IllegalBlockSizeException e) {
} catch (UnsupportedEncodingExcept ion 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
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.toCh
SecretKey key = SecretKeyFactory.getInstan
"PBEWithMD5AndDES").genera
ecipher = Cipher.getInstance(key.get
dcipher = Cipher.getInstance(key.get
// Prepare the parameter to the ciphers
AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);
// Create the ciphers
ecipher.init(Cipher.ENCRYP
dcipher.init(Cipher.DECRYP
} catch (java.security.InvalidAlgo
} catch (java.security.spec.Invali
} catch (javax.crypto.NoSuchPaddin
} catch (java.security.NoSuchAlgor
} catch (java.security.InvalidKeyE
}
}
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().e
} catch (javax.crypto.BadPaddingEx
} catch (IllegalBlockSizeException
} catch (UnsupportedEncodingExcept
}
return null;
}
public String decrypt(String str) {
try {
// Decode base64 to get bytes
byte[] dec = new sun.misc.BASE64Decoder().d
// Decrypt
byte[] utf8 = dcipher.doFinal(dec);
// Decode using utf-8
return new String(utf8, "UTF8");
} catch (javax.crypto.BadPaddingEx
} catch (IllegalBlockSizeException
} catch (UnsupportedEncodingExcept
} 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
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
Thanks
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
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.