Why am I getting 'BadPaddingException' when decrypting?

26,801

Solution 1

From my initial comment:

A typical scenario is one where the key is different from the one used at the other side. This is the most probable cause, but you might also want to check the way you handle streams, because you really lack .close() and possibly .flush() statements. You also assume that you always can read all the data into the buffer, which may not be the case.

The key was indeed calculated incorrectly.

Solution 2

BadPaddingException Error in enryption/decryption

I encountered such an error, but this helped me

http://themasterofmagik.wordpress.com/2014/03/19/simple-aes-encryption-and-decryption-in-java-part1/

hope it helps you too.

Share:
26,801
wbd
Author by

wbd

Updated on July 09, 2022

Comments

  • wbd
    wbd almost 2 years

    Here are my encryption settings:

    public static String encryptionAlgorithm = "AES";
    public static short encryptionBitCount = 256;
    public static int encryptionMessageLength = 176;
    public static String hashingAlgorithm = "PBEWITHSHAAND128BITAES-CBC-BC";
           //PBEWithSHA256And256BitAES-CBC-BC"PBEWithMD5AndDES";//"PBKDF2WithHmacSHA1";
    public static short hashingCount = 512;
    public static String cipherTransformation = "AES/CBC/PKCS5Padding";
    

    Here is my code to decrypt:

    public byte[] readMessage () throws Exception
    {
        byte[] iv = new byte[16];
        byte[] message = new byte[EncryptionSettings.encryptionMessageLength];
    
        try
        {
            // read IV from stream
            if (stream.read(iv) != 16)
                throw new Exception("Problem receiving full IV from stream");
        }
        catch (final IOException e)
        {
            throw new Exception("Unable to read IV from stream");
        }
    
        try
        {
            cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
        }
        catch (final InvalidKeyException e)
        {
            throw new Exception("Invalid key");
        }
        catch (final InvalidAlgorithmParameterException e)
        {
            throw new Exception("Invalid algorithm parameter");
        }
    
        try
        {
            //read message from stream
            if (stream.read(message) != EncryptionSettings.encryptionMessageLength)
                 throw new Exception("Problem receiving full encrypted message from stream");
        }
        catch (final IOException e)
        {
            throw new Exception("Unable to read message from stream");
        }
    
        try
        {
            return cipher.doFinal(message); //decipher message and return it.
        }
        catch (IllegalBlockSizeException e)
        {
            throw new Exception("Unable to decrypt message due to illegal block size - "
                              + e.getMessage());
        }
        catch (BadPaddingException e)
        {
            throw new Exception("Unable to decrypt message due to bad padding - "
                                + e.getMessage());
        }
    }
    

    Here is my code to encrypt:

    public void writeMessage (final byte[] message) throws Exception
    {
        try
        {
            // write iv
            byte b[] = cipher.getParameters().getParameterSpec(IvParameterSpec.class).getIV();
            System.out.println(b.length);
            stream.write(b);
        }
        catch (final InvalidParameterSpecException e) 
        {
            throw new Exception("Unable to write IV to stream due to invalid"+
                                " parameter specification");
        }
        catch (final IOException e)
        {
            throw new Exception("Unable to write IV to stream");
        }
    
        try
        {
            // write cipher text
            byte b[] = cipher.doFinal(message);
            System.out.println(b.length);
            stream.write(b);
        }
        catch (final IllegalBlockSizeException e)
        {
            throw new Exception("Unable to write cipher text to stream due to "+
                                "illegal block size");
        }
        catch (final BadPaddingException e)
        {
            throw new Exception("Unable to write cipher text to stream due to " +
                                "bad padding");
        }
        catch (final IOException e)
        {
            throw new Exception("Unable to write cipher text to stream");
        }
    }
    

    Error: Unable to decrypt message due to bad padding - null.

    I am getting a BadPaddingException when decrypting, why? The message is exactly 168 characters which is 176 after padding (divisible by 16)