title: Java Triple DES encryption with 2 different keys
body: <p>I'm trying to encrypt data using triple DES with two different keys, so given the two keys k1 and k2 the cryptotext would be Ek1(Dk2(Ek1(plaintext))) where E is Encryption and D Decryption. I'm trying to simulate this using DES algorithm from java. Here is the code:</p>
  
  <pre><code>public static void main(String[] args) {
  
      SecretKey k1 = generateDESkey();
      SecretKey k2 = generateDESkey();
  
      String firstEncryption = desEncryption("plaintext", k1);
      String decryption = desDecryption(firstEncryption, k2);
      String secondEncryption = desEncryption(decryption, k1);
  
  }
  
  public static SecretKey generateDESkey() {
      KeyGenerator keyGen = null;
      try {
          keyGen = KeyGenerator.getInstance("DES");
      } catch (NoSuchAlgorithmException ex) {
          Logger.getLogger(Test.class
                  .getName()).log(Level.SEVERE, null, ex);
      }
      keyGen.init(56); // key length 56
      SecretKey secretKey = keyGen.generateKey();
      return secretKey;
  }
  
  public static String desEncryption(String strToEncrypt, SecretKey desKey) {
      try {
          Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
          cipher.init(Cipher.ENCRYPT_MODE, desKey);
          String encryptedString = Base64.encode(cipher.doFinal(strToEncrypt.getBytes()));
          return encryptedString;
  
  
      } catch (NoSuchAlgorithmException ex) {
          Logger.getLogger(Test.class
                  .getName()).log(Level.SEVERE, null, ex);
      } catch (NoSuchPaddingException ex) {
          Logger.getLogger(Test.class
                  .getName()).log(Level.SEVERE, null, ex);
      } catch (IllegalBlockSizeException ex) {
          Logger.getLogger(Test.class
                  .getName()).log(Level.SEVERE, null, ex);
      } catch (BadPaddingException ex) {
          Logger.getLogger(Test.class
                  .getName()).log(Level.SEVERE, null, ex);
      } catch (InvalidKeyException ex) {
          Logger.getLogger(Test.class
                  .getName()).log(Level.SEVERE, null, ex);
      }
      return null;
  }
  
  public static String desDecryption(String strToDecrypt, SecretKey desKey) {
      try {
          Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5PADDING");
          cipher.init(Cipher.DECRYPT_MODE, desKey);
          String decryptedString = new String(cipher.doFinal(Base64.decode(strToDecrypt)));
          return decryptedString;
  
  
      } catch (NoSuchAlgorithmException ex) {
          Logger.getLogger(Test.class
                  .getName()).log(Level.SEVERE, null, ex);
      } catch (NoSuchPaddingException ex) {
          Logger.getLogger(Test.class
                  .getName()).log(Level.SEVERE, null, ex);
      } catch (InvalidKeyException ex) {
          Logger.getLogger(Test.class
                  .getName()).log(Level.SEVERE, null, ex);
      } catch (IllegalBlockSizeException ex) {
          Logger.getLogger(Test.class
                  .getName()).log(Level.SEVERE, null, ex);
      } catch (BadPaddingException ex) {
          Logger.getLogger(Test.class
                  .getName()).log(Level.SEVERE, null, ex);
      } catch (Base64DecodingException ex) {
          Logger.getLogger(Test.class
                  .getName()).log(Level.SEVERE, null, ex);
      }
      return null;
  }
  </code></pre>
  
  <p>I have this error: javax.crypto.BadPaddingException: Given final block not properly padded when trying to decrypt at this line of code:</p>
  
  <pre><code>String decryptedString = new String(cipher.doFinal(Base64.decode(strToDecrypt)));
  </code></pre>
  
  <p>Can you help me to resolve this problem or do you know a direct method to encrypt data using triple DES with two different keys with total key length of 128 bits? I didn't find any algorithm so I tried to simulate it using simple DES. </p>