2013-03-19 5 views
-1

J'essaye de crypter puis de décrypter un fichier en Java. J'utilise Eclipse IDE. Le programme semble fonctionner correctement, sauf que la minuterie ne fonctionne pas comme prévu. J'utilise deux minuteurs pour calculer le temps de chiffrement et de décryptage respectivement. Le temps de décryptage en millisecondes montre 0. Eclipse dit:Cryptage du fichier BlowFish java.security.InvalidKeyException (Java Eclipse)

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.<init>(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) 

Je poste par la présente mon code entier:

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

Nous vous remercions de la patience.

+1

Nous ne pouvons pas vous aider si vous ne partagez pas votre code. Veuillez écrire un petit exemple autonome qui illustre le problème que nous pouvons copier/coller/exécuter et corriger. (A.k.a an [SSCCE] (http://sscce.org/)). –

+0

Je ne pense pas que cela compte comme un SSCCE. Pourquoi confondez-vous AES et Blowfish? Veuillez d'abord refactoriser votre code. –

Répondre

0

Vous avez besoin d'une instance de chiffrement Blowfish pour effectuer le chiffrement Blowfish, et non d'une instance chiffrée pour AES. La chaîne dans getInstance() si Cipher est incorrect. De plus, vous devez vous assurer que votre clé secrète n'est pas nulle lors de l'initialisation du chiffrement.

+0

J'ai posté mon code. Pourriez-vous être plus précis quant à l'endroit où j'ai foiré. Désolé, je suis un débutant. – SidNoob

+0

Pour être honnête, je pense que cela nécessite l'utilisation correcte d'un débogueur et un examen attentif du code sur une question spécifique sur stackoverflow, cher utilisateur. Commencez par renommer vos méthodes (pourquoi AES est-il présent?) Et remplacez la valeur par défaut 'e.printStackTrace()' (la valeur par défaut insérée par la plupart des EDI avec 'throw new IllegalStateException (e)'.) –

+0

AES s1 = new AES () // AES est le nom de la classe, pourriez-vous indiquer où est-ce que je suis supposé remplacer AES avec blowfish? – SidNoob