BadPaddingException decrypting the encrypted data in Android
A BadPaddingException occurs when the padding (bytes to fill up a too small encryption block) doesn't match a specified format (for example PKCS1, OAEP, ...). This can have a few causes:
- You are using a different mode of RSA for en- and decryption.
- The data (the byte[]) you get from encryption is not the same as the one you pass to decryption.
- (You are using an incorrect KeyPair.)
Since you are initializing RSA with getInstance("RSA")
for encryption and getInstance("RSA/ECB/PKCS1Padding")
for decryption, it could be possible that ECB/PKCS1Padding is not the default on Android (even though it should be on Desktop-Java).
So try this in RSAEncrypt()
:
cipher.getInstance("RSA/ECB/PKCS1Padding");
If this does not work, make sure that you pass the exact same byte[] you get from cipher.doFinal()
in encryption to cipher.doFinal()
in decryption.
(Your code does work on my Desktop Java7 btw.)
android AES decrypt files: BadPaddingException: EVP_CipherFinal_ex
You problem is that you are always calling cipher.doFinal()
for each block of data which is wrong as each block will be padded.
If you are en/decrypting data block-wise use cipher.update(...)
and after the last block has been processed only call cipher.doFinal()
once.
The easier way would be to use a CipherInputStream/CipherOutputStream - it does exactly what I have described for you (doFinal is called when you close the stream).
Android javax.crypto.BadPaddingException
Verify that key
is the same in both Encrypt
and DecryptFile
.
Since both call generateKey
and generateKey
calls SecureRandom
nextBytes
the keys are going to be different.
You need to save the encryption key for use during decryption.
BadPaddingException in Android encrypt
I had the some problem. The solution:
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
public class StringEncrypter {
Cipher ecipher;
Cipher dcipher;
StringEncrypter(String password) {
// 8-bytes Salt
byte[] salt = {
(byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,
(byte)0x56, (byte)0x34, (byte)0xE3, (byte)0x03
};
// Iteration count
int iterationCount = 19;
try {
KeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt, iterationCount);
SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
ecipher = Cipher.getInstance(key.getAlgorithm());
dcipher = Cipher.getInstance(key.getAlgorithm());
// Prepare the parameters to the cipthers
AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);
ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
} catch (InvalidAlgorithmParameterException e) {
System.out.println("EXCEPTION: InvalidAlgorithmParameterException");
} catch (InvalidKeySpecException e) {
System.out.println("EXCEPTION: InvalidKeySpecException");
} catch (NoSuchPaddingException e) {
System.out.println("EXCEPTION: NoSuchPaddingException");
} catch (NoSuchAlgorithmException e) {
System.out.println("EXCEPTION: NoSuchAlgorithmException");
} catch (InvalidKeyException e) {
System.out.println("EXCEPTION: InvalidKeyException");
}
}
/**
* Takes a single String as an argument and returns an Encrypted version
* of that String.
* @param str String to be encrypted
* @return <code>String</code> Encrypted version of the provided String
*/
public byte[] 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);
return enc;
} catch (BadPaddingException e) {
} catch (IllegalBlockSizeException e) {
} catch (UnsupportedEncodingException e) {
}
return null;
}
/**
* Takes a encrypted String as an argument, decrypts and returns the
* decrypted String.
* @param str Encrypted String to be decrypted
* @return <code>String</code> Decrypted version of the provided String
*/
public String decrypt(byte[] dec) {
try {
// Decode base64 to get bytes
//byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);
//byte[] dec = Base64Coder.decode(str);
// Decrypt
byte[] utf8 = dcipher.doFinal(dec);
// Decode using utf-8
return new String(utf8, "UTF8");
} catch (BadPaddingException e) {
} catch (IllegalBlockSizeException e) {
} catch (UnsupportedEncodingException e) {
}
return null;
}
}
I found this solution here.
This works perfect. But I really wonder to know, what was the problem with AES.
BadPaddingException while decrypting RSA from other client
Encryption/Decryption code was fine, I was using the wrong IP address to figure out the public key. Thanks for the help though!
BadPaddingException when decrypting using RSA
There is mismatch of padding parameter in Encrpyt and Decrypt:
In encryptWithRSA()
method it is:
val cipher = Cipher.getInstance("RSA/ECB/NoPadding")
In decryptWithRSA()
method it is:
val cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA1AndMGF1Padding")
Choose one type of padding for encryption and decryption, and it should work.
Note: As Dave pointed out, having no pad is a serious security flaw, so it's better to include it for your cipher.
Related Topics
Java Input Validation for Number Range and Numeric Values Only With Counter
How to Check If an Integer Is in a Given Range
How to Sort by Two Fields in Java and Specify Sort Direction
How to Stop the Items Duplication in Recyclerview Android
Reading Data from Nested Json Object Using Java
Error: Could Not Find or Load Main Class in Intellij Ide
How to Use a Regex to Search Backwards Effectively
Multiple Queries Executed in Java in Single Statement
How to Return a Custom Object from a Spring Data JPA Group by Query
Replacing Double Backslashes With Single Backslash
Cannot Find Element Using Selenium Webdriver
Handling the Null Value from a Resultset
Cannot Get Jedis Connection; Could Not Get a Resource from the Pool
Password Encrypt and Decrypt Using Spring-Security
How to Execute SQL Script File in Java
A Better Way to Convert Integer (May Be Null) to Int in Java