Java décryptage

Fermé
deep_sea Messages postés 201 Date d'inscription mardi 10 mai 2016 Statut Membre Dernière intervention 10 décembre 2022 - Modifié le 30 mars 2022 à 11:03
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 - 31 déc. 2022 à 14:56
Bonjour tous le monde,
J'espère que vous allez bien ?
je me permets de vous poser cette question afin de m'aider à trouver l'erreur dans mon programme.
Dans la deuxième version de l'application .nous avons abordé la notion de sécurité des images sauvegardées dans le serveur SFTP.
A cet effet , nous avons deux processus :
-À la sauvegarde l'image est cryptée avant l'envoi au serveur ftp.
-A la récupération l'image est décryptée avant la copie dans un répertoire local.

L'algorithme appliqué est celui d'AES , le cryptage fonctionne sans aucun problème.

le problème majeur est le décryptage , j'ai arrivé à récupérer l'image mais toujours crypter
( le programme se bloque au niveau de l'écriture d'image )


public void crypter()
 {
       
            try {
                FileInputStream file= new FileInputStream(filename);
                System.out.println(file);
                FileOutputStream outStream = new FileOutputStream(filename);
                System.out.println(outStream);
                String str= "3251510032515100";
                byte k[]= str.getBytes();
                
                SecretKeySpec key= new SecretKeySpec(k, "AES");
                System.out.println(key);
                Cipher enc = Cipher.getInstance("AES");
                System.out.println(enc);
                enc.init(Cipher.ENCRYPT_MODE, key);        
                CipherOutputStream cos= new CipherOutputStream(outStream, enc);
                System.out.println(cos);
                byte[] buf= new byte[1024];
                System.out.println("");
                int read;
                while((read=file.read(buf))!=-1){
                    cos.write(buf,0,read);
                }
                file.close();
                outStream.flush();
                cos.close();
                System.out.println("The image was successfully encrypted");
             //   JOptionPane.showMessageDialog(null, "The image was successfully encrypted");
                
                
            } catch (FileNotFoundException ex) {
                ex.getMessage();
            }catch (Throwable exception2)
            {
                exception2.printStackTrace();
            }
 }
 public void decrypt()
 {
       
         try{

    JSch jsch = new JSch();
       Session session = null;      
    int port = Integer.parseInt(port_FTP);
       session = jsch.getSession(user_FTP, Hote_FTP, port);
       session.setConfig("StrictHostKeyChecking", "no");
       session.setPassword(pwd_FTP);
       session.connect();
       Channel channel = session.openChannel("sftp");
       channel.connect();
       ChannelSftp sftpChannel = (ChannelSftp) channel;
  Vector<ChannelSftp.LsEntry> list = sftpChannel.ls(chemin_ftp);
     
        System.out.println(list);
        
for(ChannelSftp.LsEntry entry:list) { 
    System.out.println("sftp:"+entry.getFilename());
    System.out.println("code:"+Recherche.getText()+".jpg");
       if(entry.getFilename().contains(Recherche.getText()+".jpg"))
       {
           FileInputStream file = new FileInputStream(chemin_ftp+"/"+Recherche.getText()+".jpg");
            FileOutputStream outStream = new FileOutputStream(new_path+"/"+Recherche.getText()+".jpg");
            byte k[]= "3251510032515100".getBytes();
            SecretKeySpec key = new SecretKeySpec(k, "AES");
            Cipher enc = Cipher.getInstance("AES");
            enc.init(Cipher.DECRYPT_MODE, key);
            CipherOutputStream cos = new CipherOutputStream(outStream, enc);
            byte[] buf = new byte[1024];
            int read;
            while((read=file.read(buf))!=-1){
                cos.write(buf,0,read);
            }
            file.close();
            outStream.flush();
            cos.close();
            JOptionPane.showMessageDialog(null, "The image was decrypted successfully");
            Runtime.getRuntime().exec("rundll32 url.dll, FileProtocolHandler "+"Decrypt.jpg");
       }
}

                JOptionPane.showMessageDialog(null,"Le spécimen signature n'existe pas"); 
 
        }catch(Exception e){
            JOptionPane.showMessageDialog(null, e);
        }
 }

           

// rechercher 
    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
try
{
      File directory = new  File(new_path);
  if(!directory.exists())
   {
     directory.mkdir();
   }   
    JSch jsch = new JSch();
       Session session = null;      
    int port = Integer.parseInt(port_FTP);
       session = jsch.getSession(user_FTP, Hote_FTP, port);
       session.setConfig("StrictHostKeyChecking", "no");
       session.setPassword(pwd_FTP);
       session.connect();
       Channel channel = session.openChannel("sftp");
       channel.connect();
       ChannelSftp sftpChannel = (ChannelSftp) channel;
//      String files = sftpChannel.ls(chemin_ftp).toString();
//      System.out.println(files.length());
     
  //  String[] files = directory.list();   
     //  System.out.println(files.length);
  
 if((!Recherche.getText().isEmpty()) && test1==false || (Recherche.getText().substring(0, 5).equals(Agence.substring(0,5))))
 {
            System.out.println("debut");
    test1=true;
                 Vector path = sftpChannel.ls(chemin_ftp);
                 System.out.println(path);
    // for(int i = 0; i < files.length; i++)
         //  {
                        System.out.println("debut 2");
                          if (!path.contains(Recherche.getText())) 
     //   if(files[i].toString().substring(0, 21).equals(Recherche.getText()) && test1==true)
     {
     System.out.println("ok1  " +path.get(0).toString());
     System.out.println("ok2   " +Recherche.getText());
   
            //  System.out.println(code); 
  remotefile =chemin_ftp+"/"+Recherche.getText()+".jpg";
                 System.out.println("5555"+remotefile);
                    // decrypt();
     sftpChannel.get(remotefile,new_path+"/"+Recherche.getText()+".jpg"); 
                           decrypt();  
                            System.out.println("fin");
     flag=1;
     System.out.println(flag);
                 
              System.out.println("successefully upload"); 
              /////////////////////////////////////////////////////////////////////////

            /////////////////////////////////////////////////////////////////////////////////
     ImageIcon icon = new ImageIcon((String) new_path+"/"+Recherche.getText()+".jpg");     
              Image image = icon.getImage().getScaledInstance(lb1_Image.getWidth(),lb1_Image.getHeight(), Image.SCALE_SMOOTH);
              lb1_Image.setIcon(new ImageIcon(image)); 
     /////////////////////////////FIN/////////////////////////
   
                          client2=Recherche.getText().substring(6);
                            System.out.println("client2"+client2);
                          client=client2;
                            System.out.println("client"+client);
                            jTextField1.setText(client);
                          getClient();
                          getncpnbre();
    
     
     }
     
         if(flag==0)
                          {
                lb1_Image.setIcon(new ImageIcon()); 
                JOptionPane.showMessageDialog(null,"Le spécimen signature n'existe pas"); 
                          }
 
 }
    
 else
    {
     test1=false;
  lb1_Image.setIcon(new ImageIcon()); 
     JOptionPane.showMessageDialog(null,"Veuillez saisir un code spécimen valide"); 
    } 
       
       sftpChannel.exit();
       session.disconnect();    
 
}
catch (Exception e)
{
    e.getMessage();
}
    }                                        





Je reste à votre disposition pour toutes informations complémentaires.

Cordialement
A voir également:

1 réponse

Lumberjack33 Messages postés 8 Date d'inscription samedi 31 décembre 2022 Statut Membre Dernière intervention 31 décembre 2022
31 déc. 2022 à 13:01

Voici comment je pourrais réécrire votre code de décryptage :

public void decrypt() {
    try {
        // Ouvrir le fichier à décrypter en lecture
        FileInputStream inStream = new FileInputStream(filename);

        // Ouvrir le fichier de sortie en écriture
        FileOutputStream outStream = new FileOutputStream(filename);

        // Charger la clé en utilisant la chaîne de caractères spécifiée
        String keyString = "3251510032515100";
        byte[] key = keyString.getBytes();
        SecretKeySpec secretKey = new SecretKeySpec(key, "AES");

        // Initialiser le chiffreur en mode décryptage
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);

        // Utiliser le chiffreur pour décrypter les données du fichier d'entrée et les écrire dans le fichier de sortie
        CipherOutputStream cipherOut = new CipherOutputStream(outStream, cipher);
        byte[] buffer = new byte[1024];
        int numRead;
        while ((numRead = inStream.read(buffer)) >= 0) {
            cipherOut.write(buffer, 0, numRead);
        }

        // Fermer tous les flux de fichiers
        inStream.close();
        cipherOut.close();
        outStream.close();

    } catch (Exception e) {
        // Traiter l'exception si elle se produit
        e.printStackTrace();
    }
}
 

Voici ce que j'ai fait :

  • J'ai enlevé les appels inutiles à la méthode getInstance() et aux constructeurs de FileInputStream et FileOutputStream, car ces objets sont déjà créés plus haut dans le code.
  • J'ai ajouté une chaîne de caractères contenant la clé de cryptage au début de la méthode, au lieu de la définir dans la méthode crypter(). Cela permet de réutiliser la même clé pour la cryptage et la décryptage.
  • J'ai enlevé les appels à la méthode showMessageDialog(), car elle n'est pas utilisée dans le code de décryptage.

Je vous recommande également de traiter les exceptions et de fermer tous les flux de fichiers et les sessions de canal dans une clause finally, afin de s'assurer qu'ils seront fermés même en cas d'exception.

public void decrypt() {
    try {
        // Ouvrir le fichier à décrypter en lecture
        FileInputStream inStream = new FileInputStream(filename);

        // Ouvrir le fichier de sortie en écriture
        FileOutputStream outStream = new FileOutputStream(filename);

        // Charger la clé en utilisant la chaîne de caractères spécifiée
        String keyString = "32515

1510032515100";
        byte[] key = keyString.getBytes();
        SecretKeySpec secretKey = new SecretKeySpec(key, "AES");

        // Initialiser le chiffreur en mode décryptage
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);

        // Utiliser le chiffreur pour décrypter les données du fichier d'entrée et les écrire dans le fichier de sortie
        CipherOutputStream cipherOut = new CipherOutputStream(outStream, cipher);
        byte[] buffer = new byte[1024];
        int numRead;
        while ((numRead = inStream.read(buffer)) >= 0) {
            cipherOut.write(buffer, 0, numRead);
        }
    } catch (Exception e) {
        // Traiter l'exception si elle se produit
        e.printStackTrace();
    } finally {
        // Fermer tous les flux de fichiers et les sessions de canal
        try {
            inStream.close();
            cipherOut.close();
            outStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Je vous recommande également de vérifier que les objets inStream, cipherOut et outStream sont bien initialisés avant de les fermer dans la clause finally. Vous pouvez par exemple les déclarer en dehors de la clause try, comme ceci :

FileInputStream inStream = null;
CipherOutputStream cipherOut = null;
FileOutputStream outStream = null;

try {
    // Ouvrir le fichier à décrypter en lecture
    inStream = new FileInputStream(filename);

    // Ouvrir le fichier de sortie en écriture
    outStream = new FileOutputStream(filename);

    // Charger la clé en utilisant la chaîne de caractères spécifiée
    String keyString = "3251510032515100";
    byte[] key = keyString.getBytes();
    SecretKeySpec secretKey = new SecretKeySpec(key, "AES");

    // Initialiser le chiffreur en mode décryptage
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, secretKey);

    // Utiliser le chiffreur pour décrypter les données du fichier d'entrée et les écrire dans le fichier de sortie
    cipherOut = new CipherOutputStream(outStream, cipher);
    byte[] buffer = new byte[1024];
    int numRead;
    while ((numRead = inStream.read(buffer)) >= 0) {
        cipherOut.write(buffer, 0, numRead);
    }
} catch (Exception e) {
    // Traiter l'exception si elle se produit
    e.printStackTrace();
} finally {
    // Fermer tous les flux de fichiers et les sessions de canal si nécessaire
    try {
        if (inStream != null) {
            inStream.close();
        }
        if (cipherOut != null) {
            cipherOut.close();
        }
        if (outStream != null) {
            outStream.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
 

Je vous recommande également de vérifier que le fichier à décrypter existe bien et est accessible en lecture avant d'essayer de l'ouvrir en utilisant la méthode exists() de la classe File.

File file = new File(filename);
if (!file.exists() || !file.isFile()) {
    throw new IOException("Le fichier " + filename + " n'existe pas ou n'est pas accessible en lecture");
}

// Ouvrir le fichier à décrypter en lecture
FileInputStream inStream = new FileInputStream(file);

J'espère que ça peut t'aider.
 

0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 931
31 déc. 2022 à 14:55

J'espère que ça peut t'aider.

10 mois après y'a aucune chance.


Exhumer des vieux sujets est contraire à la charte d'utilisation que tu as accepté de respecter pas plus tard qu'aujourd'hui.

De même que faire le travail des autres à leur place. Ce qu'il faut faire ici, c'est orienter, aiguiller, afin que le demandeur trouve lui-même.

Je te conseille donc de respecter un peu mieux la charte, car se faire remarquer dès son premier jour ne présage pas d'un avenir radieux au sein de la communauté.

0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 931 > Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024
31 déc. 2022 à 14:56

Dernier point, pour poster un code, il faut faire comme décrit là https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code

0