为什么我在解密时会收到’BadPaddingException’?

这是我的加密设置:

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"; 

这是我的解密代码:

 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()); } } 

这是我的加密代码:

 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"); } } 

错误: Unable to decrypt message due to bad padding - null.错误而Unable to decrypt message due to bad padding - null.

我在解密时遇到BadPaddingException,为什么? 消息正好是168个字符,填充后为176(可被16整除)

从我最初的评论:

典型的情况是密钥与另一侧使用的密钥不同。 这是最可能的原因,但您可能还想检查处理流的方式,因为您确实缺少.close()和可能的.flush()语句。 您还假设您始终可以将所有数据读入缓冲区,但情况可能并非如此。

密钥确实计算错误。

BadPaddingException enryption / decryption中的错误

我遇到了这样的错误,但这对我有所帮助

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

希望它也能帮到你。