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.
Les fichiers chargés sont stockés dans un Vector de String.
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(); } }
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 :Même en augmentant la taille maximale de la JVM (avec l’argument -Xmx), j'ai toujours le même problème.ExecutionException : java.lang.OutOfMemoryError: Java heap space.
Quelqu'un aurait des pistes pour résoudre ce problème ?
Merci d'avance pour votre aide.
Partager