├── .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 | 6 | -------------------------------------------------------------------------------- /.idea/jarRepositories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 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 | --------------------------------------------------------------------------------