title: Given final block not properly padded
body: <p>I am trying to implement password based encryption algorithm, but I get this exception:</p>
  
  <blockquote>
    <p>javax.crypto.BadPaddingException: Given final block not properly padded</p>
  </blockquote>
  
  <p>What might be the problem?</p>
  
  <p>Here is my code:</p>
  
  <pre><code>public class PasswordCrypter {
  
      private Key key;
  
      public PasswordCrypter(String password)  {
          try{
              KeyGenerator generator;
              generator = KeyGenerator.getInstance("DES");
              SecureRandom sec = new SecureRandom(password.getBytes());
              generator.init(sec);
              key = generator.generateKey();
          } catch (Exception e) {
              e.printStackTrace();
          }
      }
  
  
      public byte[] encrypt(byte[] array) throws CrypterException {
          try{
              Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
              cipher.init(Cipher.ENCRYPT_MODE, key);
  
              return cipher.doFinal(array);
          } catch (Exception e) { 
              e.printStackTrace();
          }
          return null;
      }
  
      public byte[] decrypt(byte[] array) throws CrypterException{
          try{
              Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
              cipher.init(Cipher.DECRYPT_MODE, key);
  
              return cipher.doFinal(array);
          } catch(Exception e ){
              e.printStackTrace();
          }
          return null;
      }
  }
  </code></pre>
  
  <p>(The JUnit Test)</p>
  
  <pre><code>public class PasswordCrypterTest {
  
      private static final byte[] MESSAGE = "Alpacas are awesome!".getBytes();
      private PasswordCrypter[] passwordCrypters;
      private byte[][] encryptedMessages;
  
      @Before
      public void setUp() {
          passwordCrypters = new PasswordCrypter[] {
              new PasswordCrypter("passwd"),
              new PasswordCrypter("passwd"),
              new PasswordCrypter("otherPasswd")
          };
  
          encryptedMessages = new byte[passwordCrypters.length][];
          for (int i = 0; i &lt; passwordCrypters.length; i++) {
              encryptedMessages[i] = passwordCrypters[i].encrypt(MESSAGE);
          }
      }
  
      @Test
      public void testEncrypt() {
          for (byte[] encryptedMessage : encryptedMessages) {
              assertFalse(Arrays.equals(MESSAGE, encryptedMessage));
          }
  
          assertFalse(Arrays.equals(encryptedMessages[0], encryptedMessages[2]));
          assertFalse(Arrays.equals(encryptedMessages[1], encryptedMessages[2]));
      }
  
      @Test
      public void testDecrypt() {
          for (int i = 0; i &lt; passwordCrypters.length; i++) {
              assertArrayEquals(MESSAGE, passwordCrypters[i].decrypt(encryptedMessages[i]));
          }
  
          assertArrayEquals(MESSAGE, passwordCrypters[0].decrypt(encryptedMessages[1]));
          assertArrayEquals(MESSAGE, passwordCrypters[1].decrypt(encryptedMessages[0]));
  
          try {
              assertFalse(Arrays.equals(MESSAGE, passwordCrypters[0].decrypt(encryptedMessages[2])));
          } catch (CrypterException e) {
              // Anything goes as long as the above statement is not true.
          }
  
          try {
              assertFalse(Arrays.equals(MESSAGE, passwordCrypters[2].decrypt(encryptedMessages[1])));
          } catch (CrypterException e) {
              // Anything goes as long as the above statement is not true.
          }
      }
  }
  </code></pre>