title: BlowFish File ENcryption java.security.InvalidKeyException(Java Eclipse)
body: <p>I'm trying to encrypt and then decrypt back a file in Java. I'm using Eclipse IDE. 
  The program seems to work fine except that the timer is not working as expected.
  I'm using two timers to calculate the encryption and decryption time respectively. 
  The decryption time in milliseconds shows 0. Eclipse says:</p>
  
  <pre><code>java.security.InvalidKeyException: No installed provider supports this key: (null)
      at javax.crypto.Cipher.a(DashoA13*..)
      at javax.crypto.Cipher.init(DashoA13*..)
      at javax.crypto.Cipher.init(DashoA13*..)
      at AES.&lt;init&gt;(AES.java:133)
      at AES.action(AES.java:311)
      at java.awt.Component.handleEvent(Component.java:6543)
      at java.awt.Component.postEvent(Component.java:4956)
      at java.awt.Component.postEvent(Component.java:4966)
      at java.awt.Component.dispatchEventImpl(Component.java:4676)
      at java.awt.Component.dispatchEvent(Component.java:4488)
      at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:674)
      at java.awt.EventQueue.access$400(EventQueue.java:81)
      at java.awt.EventQueue$2.run(EventQueue.java:633)
      at java.awt.EventQueue$2.run(EventQueue.java:631)
      at java.security.AccessController.doPrivileged(Native Method)
      at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
      at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
      at java.awt.EventQueue$3.run(EventQueue.java:647)
      at java.awt.EventQueue$3.run(EventQueue.java:645)
      at java.security.AccessController.doPrivileged(Native Method)
      at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
      at java.awt.EventQueue.dispatchEvent(EventQueue.java:644)
      at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
      at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
      at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
      at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
  </code></pre>
  
  <p>I'm hereby posting my entire code:</p>
  
  <pre><code>import java.awt.*;
  import javax.swing.JFileChooser;
  import java.io.FileNotFoundException;
  import java.io.InputStream;
  import java.io.OutputStream;
  import java.io.FileInputStream;
  import java.io.FileOutputStream;
  
  import javax.crypto.Cipher;
  import javax.crypto.SecretKey;
  import javax.crypto.spec.IvParameterSpec;
  import javax.crypto.CipherInputStream;
  import javax.crypto.CipherOutputStream;
  import javax.crypto.KeyGenerator;
  
  import java.security.NoSuchAlgorithmException;
  import java.security.spec.AlgorithmParameterSpec;
  
  public class AES extends java.applet.Applet {
      Label encry = new Label("Choose Algorithm:   ");
      Choice textAlignment = new Choice();
      TextField TextFieldName = new TextField("", 10);
      TextField TextFieldName2 = new TextField("", 10);
  
      Image I;
      Label label;
      Label label2;
      private static JFileChooser fc;
  
      // for AES
      Cipher ecipher;
      Cipher dcipher;
  
      // for BlowFish
      private static String cipher_key = "Blowfish";  
      private static Cipher cipher;  
      private static KeyGenerator k_generator;  
      private static SecretKey secret_key; 
  
      private long startTime = 0;
      private long stopTime = 0;
      private boolean running = false;
  
      public void start() {
          this.startTime = System.currentTimeMillis();
          this.running = true;
      }
  
  
      public void stop() {
          this.stopTime = System.currentTimeMillis();
          this.running = false;
      }
  
    //elaspsed time in milliseconds
      public long getElapsedTime() {
          long elapsed;
          if (running) {
               elapsed = (System.currentTimeMillis() - startTime);
          }
          else {
              elapsed = (stopTime - startTime);
          }
          return elapsed;
      }    
  
      private long startTime2 = 0;
      private long stopTime2 = 0;
      private boolean running2 = false;
  
      public void start2() {
          this.startTime2 = System.currentTimeMillis();
          this.running2 = true;
      }
  
  
      public void stop2() {
          this.stopTime2 = System.currentTimeMillis();
          this.running2 = false;
      }
  
    //elaspsed time in milliseconds
      public long getElapsedTime2() {
          long elapsed;
          if (running2) {
               elapsed = (System.currentTimeMillis() - startTime2);
          }
          else {
              elapsed = (stopTime2 - startTime2);
          }
          return elapsed;
      }    
  
  
      public AES(SecretKey key)
      {
          // Create an 8-byte initialization vector
          byte[] iv = new byte[]
          {
              0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
          };
  
          AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
          try
          {
              ecipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
              dcipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
  
              // CBC requires an initialization vector
              ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
              dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
          }
          catch (Exception e)
          {
              e.printStackTrace();
          }
      }
  
      // Buffer used to transport the bytes from one stream to another
          static byte[] buf = new byte[1024];
  
          public void encrypt(InputStream in, OutputStream out)
          {
              try
              {
                  // Bytes written to out will be encrypted
                  out = new CipherOutputStream(out, ecipher);
  
                  // Read in the cleartext bytes and write to out to encrypt
                  int numRead = 0;
                  while ((numRead = in.read(buf)) &gt;= 0)
                  {
                      out.write(buf, 0, numRead);
                  }
                  out.close();
              }
              catch (java.io.IOException e)
              {
              }
          }
  
          public void decrypt(InputStream in, OutputStream out)
          {
              try
              {
                  // Bytes read from in will be decrypted
                  in = new CipherInputStream(in, dcipher);
  
                  // Read in the decrypted bytes and write the cleartext to out
                  int numRead = 0;
                  while ((numRead = in.read(buf)) &gt;= 0)
                  {
                      out.write(buf, 0, numRead);
                  }
                  out.close();
              }
              catch (java.io.IOException e)
              {
              }
          }
  
          // for BlowFish encryption
          public void encrypt_data(InputStream in, OutputStream out) throws InvalidKeyException, IOException
          {
              //initialize the cipher  for decryption  
                 cipher.init(Cipher.ENCRYPT_MODE, secret_key);  
  
              // Bytes written to out will be encrypted
                  out = new CipherOutputStream(out, cipher);
  
                  // Read in the cleartext bytes and write to out to encrypt
                  int numRead = 0;
                  while ((numRead = in.read(buf)) &gt;= 0)
                  {
                      out.write(buf, 0, numRead);
                  }
                  out.close();
          }
  
          //for BlowFish decryption
           public void decrypt_data(InputStream in, OutputStream out) throws InvalidKeyException,  IOException {
  
               // initialize the cipher once again
                cipher.init(Cipher.DECRYPT_MODE, secret_key);      
  
                  // Bytes read from in will be decrypted
                  in = new CipherInputStream(in, cipher);
  
  
                  int numRead = 0;
                  while ((numRead = in.read(buf)) &gt;= 0)
                  {
                      out.write(buf, 0, numRead);
                  }
                  out.close();
           }
  
  
  
           public AES() {
                  setLayout(new FlowLayout());
                  //simpleMethod();
           } 
  
      public void init() {
  
                  I=getImage(getCodeBase(),"lock.png");
                  add(encry);
                  label = new Label("Encryption Time ", Label.RIGHT);
                  label2 = new Label("Decryption Time ", Label.RIGHT);
  
          //Add 4 different options to it:
                  textAlignment.add("AES");
                  textAlignment.add("BlowFish");
                  textAlignment.add("PBE");
  
          //Then add the drop down list to the screen
                  add(textAlignment);
                  add(label);
                  add(TextFieldName);
                  add(label2);
                  add(TextFieldName2);
  
          }
  
  
          //AES button caused the event
          public boolean action(Event event, Object object) {
               if (event.target == textAlignment) {
                    String selection = textAlignment.getSelectedItem();
  
  
                        if (fc == null) {
                              fc = new JFileChooser(".");
                          }
                          // Show it.
                          int returnVal = fc.showOpenDialog(this);
                          if (returnVal == JFileChooser.APPROVE_OPTION) { 
  
  
                                    if (selection.equals("AES")){
                                         AES s1 = new AES();
  
                               s1.start(); // timer start
                              KeyGenerator kgen;
                              try {
                                  kgen = KeyGenerator.getInstance("AES");
  
                                  kgen.init(128);
                                  SecretKey key           =   kgen.generateKey();
  
                                  // Create encrypter/decrypter class
                                  // Create encrypter/decrypter class
                                  AES encrypter = new AES(key);
  
                                      try {
                                          encrypter.encrypt(new FileInputStream(fc.getSelectedFile().getPath()),new FileOutputStream("C:/Users/Acer/Desktop/encrypted"));
                                      s1.stop(); // timer stops
  
                                      } catch (FileNotFoundException e) {
                                          // TODO Auto-generated catch block
                                          e.printStackTrace();
                                      }
                                         AES s2 = new AES();
                                      // Decrypt
                                      try {
                                          s2.start2(); // timer starts
                                          encrypter.decrypt(new FileInputStream("C:/Users/Acer/Desktop/encrypted"),new FileOutputStream("C:/Users/Acer/Desktop/decrypted"));
                                          s2.stop2(); // timer stops
  
                                      } catch (FileNotFoundException e) {
                                          // TODO Auto-generated catch block
                                          e.printStackTrace();
                                      }
  
                                      TextFieldName.setText(Long.toString(s1.getElapsedTime())); 
                                      TextFieldName2.setText(Long.toString(s2.getElapsedTime2())); }
  
                               catch (NoSuchAlgorithmException e1) {
                                  // TODO Auto-generated catch block
                                  e1.printStackTrace();
                              }               
                      }
      }
                               if (selection.equals("BlowFish")){
                                     AES s1 = new AES();
                                     AES s2 = new AES();
  
                                       AES encryption = new AES(secret_key);
  
  
                                       s1.start(); // timer start
                                     //Generate encryption key based on codecypherkey code word  
                                     try {
                                      k_generator = KeyGenerator.getInstance(cipher_key);
                                  } catch (NoSuchAlgorithmException e1) {
                                      // TODO Auto-generated catch block
                                      e1.printStackTrace();
                                  }  
  
                                     //Create a secret key  
                                     secret_key = k_generator.generateKey();  
  
  
                                     //Create Cipher based on the previous encryption key code  
                                     try {
                                      cipher = Cipher.getInstance(cipher_key);
                                  } catch (NoSuchAlgorithmException e) {
                                      // TODO Auto-generated catch block
                                      e.printStackTrace();
                                  } catch (NoSuchPaddingException e) {
                                      // TODO Auto-generated catch block
                                      e.printStackTrace();
                                  } 
  
                                  try {
                                      encryption.encrypt_data(new FileInputStream(fc.getSelectedFile().getPath()),new FileOutputStream("C:/Users/Acer/Desktop/encrypted"));
                                      s1.stop(); // timer stops
                                  } catch (FileNotFoundException e) {
                                      // TODO Auto-generated catch block
                                      e.printStackTrace();
                                  } catch (InvalidKeyException e) {
                                      // TODO Auto-generated catch block
                                      e.printStackTrace();
                                  } catch (IOException e) {
                                      // TODO Auto-generated catch block
                                      e.printStackTrace();
                                  }
                                  try {
                                         s2.start();
                                      encryption.decrypt_data(new FileInputStream("C:/Users/Acer/Desktop/encrypted"),new FileOutputStream("C:/Users/Acer/Desktop/decrypted"));
                                          s2.stop();
  
                                          TextFieldName.setText(Long.toString(s1.getElapsedTime())); 
                                          TextFieldName2.setText(Long.toString(s2.getElapsedTime2())); 
  
                                          } catch (FileNotFoundException e) {
                                      // TODO Auto-generated catch block
                                      e.printStackTrace();
                                  } catch (InvalidKeyException e) {
                                              // TODO Auto-generated catch block
                                              e.printStackTrace();
                                          } catch (IOException e) {
                                              // TODO Auto-generated catch block
                                              e.printStackTrace();
                                          }
                                  }
  
  
  
  
                               }
  
              return running;
              }
  
  
          public void paint(Graphics g)
          {
          g.drawImage(I,10,10,this);
          }}
  </code></pre>
  
  <p>Thank You for the patience.</p>