├── .gitignore
├── .idea
├── .gitignore
├── artifacts
│ └── FileEncryption_jar.xml
├── compiler.xml
├── discord.xml
├── jarRepositories.xml
├── misc.xml
├── uiDesigner.xml
└── vcs.xml
├── README.md
├── pom.xml
└── src
└── main
└── java
└── me
└── dickmeister
├── FileEncryption.java
└── file
├── folder
├── FolderDecryption.java
└── FolderEncryption.java
├── gui
└── JFrameUtil.java
└── util
└── EncryptionUtil.java
/.gitignore:
--------------------------------------------------------------------------------
1 | # Project exclude paths
2 | /target/
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 |
--------------------------------------------------------------------------------
/.idea/artifacts/FileEncryption_jar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | $PROJECT_DIR$/out/artifacts/FileEncryption_jar
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/.idea/discord.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/jarRepositories.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/.idea/uiDesigner.xml:
--------------------------------------------------------------------------------
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 |
93 |
94 | -
95 |
96 |
97 |
98 |
99 | -
100 |
101 |
102 | -
103 |
104 |
105 | -
106 |
107 |
108 | -
109 |
110 |
111 | -
112 |
113 |
114 |
115 |
116 | -
117 |
118 |
119 | -
120 |
121 |
122 |
123 |
124 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # FileEncryption
2 | Folder encryption program
3 |
4 | # How to use
5 |
6 | * Run the program
7 | * Select folder to encrypt/decrypt
8 | * Select action
9 | * Enter master password
10 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | org.example
8 | FileEncryption
9 | 1.0-SNAPSHOT
10 |
11 |
12 |
13 | org.projectlombok
14 | lombok
15 | 1.18.20
16 | provided
17 |
18 |
19 | com.google.collections
20 | google-collections
21 | 1.0
22 |
23 |
24 | org.apache.commons
25 | commons-lang3
26 | 3.3.2
27 |
28 |
29 |
30 |
31 | 14
32 | 14
33 |
34 |
35 |
--------------------------------------------------------------------------------
/src/main/java/me/dickmeister/FileEncryption.java:
--------------------------------------------------------------------------------
1 | package me.dickmeister;
2 |
3 | import me.dickmeister.file.folder.FolderDecryption;
4 | import me.dickmeister.file.folder.FolderEncryption;
5 | import me.dickmeister.file.gui.JFrameUtil;
6 |
7 | import javax.swing.*;
8 | import java.io.File;
9 | import java.util.Objects;
10 |
11 | public class FileEncryption {
12 |
13 | public void start() {
14 |
15 | var folder = this.selectFolder();
16 | if (Objects.nonNull(folder)) {
17 |
18 | var action = this.askAction();
19 |
20 | var password = JFrameUtil.askPassword();
21 | if (Objects.isNull(password)) {
22 | JOptionPane.showMessageDialog(null, "No password entered!");
23 | System.exit(0);
24 | return;
25 | }
26 |
27 | System.out.println("Action: " + action);
28 | switch (action) {
29 | case 1 -> decrypt(folder, password);
30 | case 0 -> encrypt(folder, password);
31 | }
32 |
33 | }
34 | }
35 |
36 | private void decrypt(File folder, String master) {
37 | System.out.println("Decrypting...");
38 | var folderDecryption = new FolderDecryption(folder);
39 | folderDecryption.decrypt(master);
40 |
41 | }
42 |
43 | private void encrypt(File folder, String master) {
44 | System.out.println("Encrypting...");
45 | var folderEncryption = new FolderEncryption(folder);
46 | folderEncryption.encrypt(master);
47 | }
48 |
49 | public File selectFolder() {
50 | var fileChooser = new JFileChooser();
51 | fileChooser.setCurrentDirectory(new File(System.getProperty("user.home")));
52 | fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
53 |
54 | var result = fileChooser.showOpenDialog(null);
55 | System.out.println("result : " + result);
56 | if (result == JFileChooser.APPROVE_OPTION) {
57 | var selectedFile = fileChooser.getSelectedFile();
58 |
59 | if (!selectedFile.isDirectory()) {
60 | JOptionPane.showMessageDialog(null, "Selected file is not a directory!");
61 | return null;
62 | }
63 |
64 | return selectedFile;
65 |
66 | }
67 |
68 | JOptionPane.showMessageDialog(null, "No folder selected!");
69 | return null;
70 | }
71 |
72 | private int askAction() {
73 | Object[] options = {"Encrypt",
74 | "Decrypt"};
75 | return JOptionPane.showOptionDialog(null,
76 | "What action do you want to perform?",
77 | "FileEncryption",
78 | JOptionPane.NO_OPTION,
79 | JOptionPane.QUESTION_MESSAGE,
80 | null,
81 | options,
82 | options[1]);
83 | }
84 |
85 | public static void main(String[] args) {
86 | var encryption = new FileEncryption();
87 | encryption.start();
88 | }
89 |
90 | }
91 |
--------------------------------------------------------------------------------
/src/main/java/me/dickmeister/file/folder/FolderDecryption.java:
--------------------------------------------------------------------------------
1 | package me.dickmeister.file.folder;
2 |
3 | import lombok.RequiredArgsConstructor;
4 | import me.dickmeister.file.util.EncryptionUtil;
5 |
6 | import java.io.File;
7 | import java.io.IOException;
8 | import java.nio.file.Files;
9 | import java.util.Arrays;
10 | import java.util.Objects;
11 |
12 | @RequiredArgsConstructor
13 | public class FolderDecryption {
14 |
15 | private final File folder;
16 |
17 | public void decrypt(String master) {
18 | try {
19 | var files = folder.listFiles();
20 |
21 | if (Objects.nonNull(files)) {
22 | Arrays.stream(files).forEach(f -> {
23 | try {
24 | System.out.println("Decrypting " + f.getName() + "...");
25 | var data = Files.readAllBytes(f.toPath());
26 | var encrypted = EncryptionUtil.decryptData(data, master);
27 |
28 | assert encrypted != null;
29 | Files.write(f.toPath(), encrypted);
30 | System.out.println("Done\n");
31 |
32 | } catch (IOException e) {
33 | e.printStackTrace();
34 | }
35 | });
36 | }
37 |
38 | } catch (Exception e) {
39 | e.printStackTrace();
40 | }
41 | }
42 |
43 | }
44 |
--------------------------------------------------------------------------------
/src/main/java/me/dickmeister/file/folder/FolderEncryption.java:
--------------------------------------------------------------------------------
1 | package me.dickmeister.file.folder;
2 |
3 | import lombok.RequiredArgsConstructor;
4 | import me.dickmeister.file.util.EncryptionUtil;
5 |
6 | import java.io.File;
7 | import java.io.IOException;
8 | import java.nio.file.Files;
9 | import java.util.Arrays;
10 | import java.util.Objects;
11 |
12 | @RequiredArgsConstructor
13 | public class FolderEncryption {
14 |
15 | private final File folder;
16 |
17 | public void encrypt(String master) {
18 | try {
19 | var files = folder.listFiles();
20 |
21 | if (Objects.nonNull(files)) {
22 | Arrays.stream(files).forEach(f -> {
23 | try {
24 | System.out.println("Encrypting " + f.getName() + "...");
25 | var data = Files.readAllBytes(f.toPath());
26 | var encrypted = EncryptionUtil.encryptData(data, master);
27 |
28 | assert encrypted != null;
29 | Files.write(f.toPath(), encrypted);
30 | System.out.println("Done\n");
31 |
32 | } catch (IOException e) {
33 | e.printStackTrace();
34 | }
35 | });
36 | }
37 |
38 | } catch (Exception e) {
39 | e.printStackTrace();
40 | }
41 | }
42 |
43 |
44 | }
45 |
--------------------------------------------------------------------------------
/src/main/java/me/dickmeister/file/gui/JFrameUtil.java:
--------------------------------------------------------------------------------
1 | package me.dickmeister.file.gui;
2 |
3 | import javax.swing.*;
4 |
5 | public class JFrameUtil {
6 |
7 | public static String askPassword() {
8 | String s = (String) JOptionPane.showInputDialog(
9 | null,
10 | "Enter master password!",
11 | "Folder Encryption",
12 | JOptionPane.PLAIN_MESSAGE,
13 | null,
14 | null,
15 | "");
16 |
17 | if ((s != null) && (s.length() > 0)) {
18 | return s;
19 | }
20 |
21 | return null;
22 | }
23 |
24 |
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/java/me/dickmeister/file/util/EncryptionUtil.java:
--------------------------------------------------------------------------------
1 | package me.dickmeister.file.util;
2 |
3 | import javax.crypto.Cipher;
4 | import javax.crypto.SecretKeyFactory;
5 | import javax.crypto.spec.IvParameterSpec;
6 | import javax.crypto.spec.PBEKeySpec;
7 | import javax.crypto.spec.SecretKeySpec;
8 |
9 | public class EncryptionUtil {
10 |
11 | private static final String SALT = "CHUJ";
12 |
13 | public static byte[] encryptData(byte[] data, String master) {
14 | try {
15 | byte[] iv = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
16 | var ivspec = new IvParameterSpec(iv);
17 |
18 | var factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
19 | var spec = new PBEKeySpec(master.toCharArray(), SALT.getBytes(), 65536, 256);
20 | var tmp = factory.generateSecret(spec);
21 | var secretKey = new SecretKeySpec(tmp.getEncoded(), "AES");
22 |
23 | var cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
24 | cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivspec);
25 | return cipher.doFinal(data);
26 | } catch (Exception e) {
27 | return null;
28 | }
29 | }
30 |
31 | public static byte[] decryptData(byte[] data, String master) {
32 | try {
33 | final byte[] iv = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
34 | var ivspec = new IvParameterSpec(iv);
35 |
36 | var factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
37 | var spec = new PBEKeySpec(master.toCharArray(), SALT.getBytes(), 65536, 256);
38 | var tmp = factory.generateSecret(spec);
39 | var secretKey = new SecretKeySpec(tmp.getEncoded(), "AES");
40 |
41 | var cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
42 | cipher.init(Cipher.DECRYPT_MODE, secretKey, ivspec);
43 | return cipher.doFinal(data);
44 | } catch (Exception e) {
45 | return null;
46 | }
47 | }
48 |
49 | }
50 |
--------------------------------------------------------------------------------