Encryption Module
1: import javax.crypto.Cipher;
2: import javax.crypto.SecretKeyFactory;
3: import javax.crypto.spec.GCMParameterSpec;
4: import javax.crypto.spec.PBEKeySpec;
5: import javax.crypto.spec.SecretKeySpec;
6: import java.security.SecureRandom;
7: import java.io.ByteArrayOutputStream;
8: import java.nio.file.Files;
9: import java.io.File;
10:
11: public class EncryptionModule {
12: private int aesKeyLength = 256;
13:
14: private SecretKeySpec getSecretKeyPBKDF2(String password,
byte[] salt) throws Exception {
15: PBEKeySpec spec = new
PBEKeySpec(password.toCharArray(), salt, 65536, aesKeyLength);
16: SecretKeyFactory factory =
SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
17: byte[] keyBytes =
factory.generateSecret(spec).getEncoded();
18: return new SecretKeySpec(keyBytes, "AES");
19: }
20:
21: public byte[] encryptFile(File file, String password)
throws Exception {
22: byte[] fileData = Files.readAllBytes(file.toPath());
23:
24: byte[] salt = new byte[16];
25: SecureRandom sr = new SecureRandom();
26: sr.nextBytes(salt);
27: SecretKeySpec secretKey = getSecretKeyPBKDF2(password,
salt);
28:
29: Cipher cipher =
Cipher.getInstance("AES/GCM/NoPadding");
30: byte[] iv = new byte[12];
31: sr.nextBytes(iv);
32: GCMParameterSpec gcmSpec = new GCMParameterSpec(128,
iv);
33: cipher.init(Cipher.ENCRYPT_MODE, secretKey, gcmSpec);
34:
35: byte[] encryptedData = cipher.doFinal(fileData);
36:
37: ByteArrayOutputStream bos = new
ByteArrayOutputStream();
38: bos.write(salt);
39: bos.write(iv);
40: bos.write(encryptedData);
41: return bos.toByteArray();
42: }
43: }
44:
Decryption Module
1: import javax.crypto.Cipher;
2: import javax.crypto.SecretKeyFactory;
3: import javax.crypto.spec.GCMParameterSpec;
4: import javax.crypto.spec.PBEKeySpec;
5: import javax.crypto.spec.SecretKeySpec;
6: import java.nio.file.Files;
7: import java.util.Arrays;
8: import java.io.File;
9:
10: public class DecryptionModule {
11: private int aesKeyLength = 256;
12:
13: private SecretKeySpec getSecretKeyPBKDF2(String password,
byte[] salt) throws Exception {
14: PBEKeySpec spec = new
PBEKeySpec(password.toCharArray(), salt, 65536, aesKeyLength);
15: SecretKeyFactory factory =
SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
16: byte[] keyBytes =
factory.generateSecret(spec).getEncoded();
17: return new SecretKeySpec(keyBytes, "AES");
18: }
19:
20: public byte[] decryptFile(File encryptedFile, String
password) throws Exception {
21: byte[] encryptedData =
Files.readAllBytes(encryptedFile.toPath());
22:
23: if (encryptedData.length < 28) {
24: throw new Exception("Invalid encrypted data
length");
25: }
26:
27: byte[] salt = Arrays.copyOfRange(encryptedData, 0,
16);
28: byte[] iv = Arrays.copyOfRange(encryptedData, 16, 28);
29: byte[] actualData = Arrays.copyOfRange(encryptedData,
28, encryptedData.length);
30:
31: SecretKeySpec secretKey = getSecretKeyPBKDF2(password,
salt);
32: Cipher cipher =
Cipher.getInstance("AES/GCM/NoPadding");
33: GCMParameterSpec gcmSpec = new GCMParameterSpec(128,
iv);
34: cipher.init(Cipher.DECRYPT_MODE, secretKey, gcmSpec);
35:
36: return cipher.doFinal(actualData);
37: }
38: }
39:
GUI Implementation
1: import javax.swing.*;
2: import java.awt.*;
3: import java.awt.event.*;
4: import java.io.*;
5: import javax.swing.filechooser.FileNameExtensionFilter;
6: import com.formdev.flatlaf.FlatLightLaf;
7: import com.formdev.flatlaf.FlatDarkLaf;
8:
9: public class SecureImageEncryptionGUI extends JFrame {
10: private JButton selectImageBtn, encryptBtn, decryptBtn,
resetBtn, exitBtn, toggleThemeBtn;
11: private JLabel imagePreview, statusLabel;
12: private JTextField passwordField;
13: private JCheckBox showPassword;
14: private JFileChooser fileChooser;
15: private File selectedFile;
16: private JProgressBar progressBar;
17: private boolean darkMode = false;
18:
19: public SecureImageEncryptionGUI() {
20: setTitle("Secure Image Encryption & Decryption");
21: setSize(700, 500);
22: setDefaultCloseOperation(EXIT_ON_CLOSE);
23: setLayout(new BorderLayout());
24:
25: JPanel buttonPanel = new JPanel();
26: selectImageBtn = new JButton("Select Image");
27: encryptBtn = new JButton("Encrypt");
28: decryptBtn = new JButton("Decrypt");
29: resetBtn = new JButton("Reset");
30: exitBtn = new JButton("Exit");
31: toggleThemeBtn = new JButton("Toggle Theme");
32:
33: buttonPanel.add(selectImageBtn);
34: buttonPanel.add(encryptBtn);
35: buttonPanel.add(decryptBtn);
36: buttonPanel.add(resetBtn);
37: buttonPanel.add(exitBtn);
38: buttonPanel.add(toggleThemeBtn);
39:
40: imagePreview = new JLabel("No Image Selected",
SwingConstants.CENTER);
41:
imagePreview.setBorder(BorderFactory.createLineBorder(Color.GRAY)
);
42:
43: JPanel passwordPanel = new JPanel();
44: passwordField = new JPasswordField(15);
45: showPassword = new JCheckBox("Show Password");
46: passwordPanel.add(new JLabel("Password: "));
47: passwordPanel.add(passwordField);
48: passwordPanel.add(showPassword);
49:
50: progressBar = new JProgressBar(0, 100);
51: progressBar.setStringPainted(true);
52:
53: statusLabel = new JLabel("Status: Ready",
SwingConstants.CENTER);
54:
55: add(buttonPanel, BorderLayout.NORTH);
56: add(imagePreview, BorderLayout.CENTER);
57: add(passwordPanel, BorderLayout.SOUTH);
58: add(progressBar, BorderLayout.PAGE_END);
59: add(statusLabel, BorderLayout.PAGE_START);
60:
61: fileChooser = new JFileChooser();
62: fileChooser.setFileFilter(new
FileNameExtensionFilter("Image Files", "png", "jpg", "jpeg"));
63:
64: selectImageBtn.addActionListener(e -> selectImage());
65: encryptBtn.addActionListener(e -> encryptImage());
66: decryptBtn.addActionListener(e -> decryptImage());
67: resetBtn.addActionListener(e -> resetFields());
68: exitBtn.addActionListener(e -> System.exit(0));
69: showPassword.addActionListener(e ->
togglePasswordVisibility());
70: toggleThemeBtn.addActionListener(e -> toggleTheme());
71: }
72:
73: private void selectImage() {
74: int result = fileChooser.showOpenDialog(this);
75: if (result == JFileChooser.APPROVE_OPTION) {
76: selectedFile = fileChooser.getSelectedFile();
77: imagePreview.setText(selectedFile.getName());
78: statusLabel.setText("Selected: " +
selectedFile.getName());
79: }
80: }
81:
82: public static void main(String[] args) {
83: SwingUtilities.invokeLater(() -> {
84: SecureImageEncryptionGUI gui = new
SecureImageEncryptionGUI();
85: gui.setVisible(true);
86: });
87: }
88: }
89: