Bonjour,

Dans mon application, je peux crypter les fichiers chargés avec l'algorithme de cryptage AES.

Toute la partie de cryptage est exécutée dans un SwingWorker pour ne pas avoir l'interface graphique figée lors de l'opération de cryptage.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
public class Cryptage extends SwingWorker<Void, Void> {
 
...
 
// Méthode exécuter en tâche de fond par le SwingWorker
    @Override
    protected Void doInBackground() throws Exception {
 
        // Message de lancement du cryptage de fichiers affiché dans la progressBar
        IHM.barre.setString("Cryptage en cours...");
 
        // Appel de la méthode permettant de crypter les fichiers chargés
        crypterFichiers();
 
        return null;
    }
 
    // Méthode exécutée automatiquement après doInBackground()
    public void done() {
 
            // Remonté d'erreurs possibles
            try { 
 
                get(); 
 
            } catch (InterruptedException e) { 
 
                System.out.println("InterruptedException :" + e.getMessage()); 
 
            } catch (ExecutionException e) { 
 
                System.out.println("ExecutionException : " + e.getMessage());
            } 
 
            // Message de confirmation affiché dans la progressBar
            IHM.barre.setString("Cryptage terminé");
    }
 
// Méthode permettant de crypter les fichiers chargés
    protected void crypterFichiers () {
 
        File tempFile = null;
 
        try {
 
            for (int i = 0; i < cheminFichiersRenommes.size(); i++) {
 
                tempFile = new File(cheminFichiersRenommes.get(i));
 
                byte[] data = new byte[(int) tempFile.length()];
 
                // Génération de la clé 256bits utilisée par l'algorithme de cryptage AES
                keyGen = KeyGenerator.getInstance("AES");
                keyGen.init(256);
                key = keyGen.generateKey();
 
                /*
                System.out.println("cle (" + key.getAlgorithm() + "," + key.getFormat()
                        + ") : " + new String(key.getEncoded()));
                
                System.out.println("Val hexa cle : " + bytesToHex(key.getEncoded()));
                System.out.println("chemin fichier a crypter : " + cheminFichiersRenommes.get(i));
                */
 
                // Création de l'objet chiffreur
                aesCipher = Cipher.getInstance("AES");
                aesCipher.init(Cipher.ENCRYPT_MODE, key);
 
                // Ouverture d'un flux d'écriture pour créer le fichier crypter
                fos = new FileOutputStream(tempFile);
 
                // Ouverture d'un flux de cryptage pour crypter le fichier
                cos = new CipherOutputStream(fos, aesCipher);
 
                // Cryptage du fichier
                cos.write(data);
 
                cos.close();
                fos.close();
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
Les fichiers chargés sont stockés dans un Vector de String.

Je n'ai pas de problème lorsque le ou les fichiers à crypter ont une taille inférieur à 500Mo.

Au-delà, j'ai un dépassement mémoire de la pile :
ExecutionException : java.lang.OutOfMemoryError: Java heap space.
Même en augmentant la taille maximale de la JVM (avec l’argument -Xmx), j'ai toujours le même problème.

Quelqu'un aurait des pistes pour résoudre ce problème ?

Merci d'avance pour votre aide.