Badpaddingexception Decrypting the Encrypted Data in Android

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:

  1. You are using a different mode of RSA for en- and decryption.
  2. The data (the byte[]) you get from encryption is not the same as the one you pass to decryption.
  3. (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



Leave a reply



Submit