title: Java Decryption - Input length must be multiple of 8 when decrypting with padded cipher
body: <p>I have a project for a security course but i'm having an issue.</p>
  
  <p>basically , i'm trying to encrypt then decrypt a password but i'm getting this error for the decryption . </p>
  
  <p>"Input length must be multiple of 8 when decrypting with padded cipher"</p>
  
  <p>Am i doing this the right way . I was following an article from 2012 . Is it still secure ?</p>
  
  <p>Also i tried replacing the algorithm but nothing seems to work :</p>
  
  <p>"AES" , "RSA/ECB/PKCS1Padding" , "PBEWithHmacSHA256AndDESede"..and many more</p>
  
  <p>i get : </p>
  
  <p>Exception in thread "main" java.security.NoSuchAlgorithmException: RSA/ECB/PKCS1Padding SecretKeyFactory not </p>
  
  <hr>
  
  <pre><code>import java.io.IOException;
  import java.io.UnsupportedEncodingException;
  import java.security.GeneralSecurityException;
  
  import javax.crypto.Cipher;
  import javax.crypto.SecretKey;
  import javax.crypto.SecretKeyFactory;
  import javax.crypto.spec.PBEKeySpec;
  import javax.crypto.spec.PBEParameterSpec;
  
  import java.util.Base64;
  
  public class ProtectedConfigFile {
  
      private static final char[] PASSWORD = "ytfchchchgcv".toCharArray();
      private static final byte[] SALT = {
          (byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12,
          (byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12,
      };
  
    public static void main(String[] args) throws Exception {
          String originalPassword = "secret";
          System.out.println("Original password: " + originalPassword);
          String encryptedPassword = encrypt(originalPassword);
          System.out.println("Encrypted password: " + encryptedPassword);
          String decryptedPassword = decrypt(encryptedPassword);
          System.out.println("Decrypted password: " + decryptedPassword);
      }
  
      private static String encrypt(String property) throws GeneralSecurityException, UnsupportedEncodingException {
          SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
          SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD));
          Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
          pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT, 20));
          return Base64.getEncoder().encodeToString(pbeCipher.doFinal(property.getBytes("UTF-8")));
      }
  
      private static String decrypt(String property) throws GeneralSecurityException, IOException {
          SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
          SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD));
          Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
          pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(SALT, 20));
          byte[] decode = Base64.getDecoder().decode(pbeCipher.doFinal(property.getBytes("UTF-8")));
          return decode.toString();
      }
  
  }
  </code></pre>
  
  <p>This returns :</p>
  
  <pre><code>Original password: secret
  Encrypted password: eG+qiRan1Cw=
  Exception in thread "main" javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher
      at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:913)
      at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:824)
      at com.sun.crypto.provider.PBES1Core.doFinal(PBES1Core.java:416)
      at com.sun.crypto.provider.PBEWithMD5AndDESCipher.engineDoFinal(PBEWithMD5AndDESCipher.java:316)
      at javax.crypto.Cipher.doFinal(Cipher.java:2165)
      at ProtectedConfigFile.decrypt(ProtectedConfigFile.java:43)
      at ProtectedConfigFile.main(ProtectedConfigFile.java:26)
  </code></pre>