IED Code
IED Code
import com.formdev.flatlaf.FlatDarkLaf;
import com.formdev.flatlaf.FlatIntelliJLaf;
import com.formdev.flatlaf.FlatLaf;
import javax.swing.Box; // For Box.createRigidArea
import java.io.IOException; // Ensure IOException is imported
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.BasicStroke;
import java.awt.Desktop;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.nio.file.Files;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.prefs.Preferences;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextPane;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.Timer;
import javax.swing.TransferHandler;
import javax.swing.UIManager;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import javax.crypto.spec.GCMParameterSpec; // Ensure
GCMParameterSpec is imported
import java.awt.datatransfer.DataFlavor; // Ensure DataFlavor is
imported
import java.awt.Cursor; // Ensure Cursor is imported
import java.awt.datatransfer.Transferable; // Ensure Transferable
is imported
public ImageEncryptionGUI() {
setTitle("Secure Image Encryption Tool");
setSize(1200, 800);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setLayout(new BorderLayout(5, 5));
setResizable(true);
panel.setBorder(BorderFactory.createTitledBorder("Encryption
Panel"));
panel.setMinimumSize(new Dimension(100, 200));
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCR
OLLBAR_ALWAYS);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLB
AR_AS_NEEDED);
panel.add(topPanel, BorderLayout.NORTH);
panel.add(scrollPane, BorderLayout.CENTER);
panel.add(encryptionProgress, BorderLayout.SOUTH);
return panel;
}
panel.setBorder(BorderFactory.createTitledBorder("Decryption
Panel"));
panel.setMinimumSize(new Dimension(100, 200));
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCR
OLLBAR_ALWAYS);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLB
AR_AS_NEEDED);
decryptionProgress = new JProgressBar();
decryptionProgress.setStringPainted(true);
decryptionProgress.setForeground(Color.BLUE);
panel.add(topPanel, BorderLayout.NORTH);
panel.add(scrollPane, BorderLayout.CENTER);
panel.add(decryptionProgress, BorderLayout.SOUTH);
return panel;
}
@Override
@SuppressWarnings("unchecked")
public boolean importData(TransferSupport support) {
if (!canImport(support)) return false;
try {
List<File> files = (List<File>)
support.getTransferable().getTransferData(DataFlavor.javaFileListF
lavor);
for (File file : files) {
if (isDecryption ?
isValidEncryptedFile(file) : isValidImageFile(file)) {
fileList.add(file);
addImageThumbnail(file, panel,
fileList, isDecryption);
}
}
return true;
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
}
});
}
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); // Set
hand cursor
}
@Override
public void
mouseReleased(java.awt.event.MouseEvent e) {
setCursor(Cursor.getDefaultCursor()); //
Reset cursor
}
});
addMouseMotionListener(new
java.awt.event.MouseMotionAdapter() {
@Override
public void
mouseDragged(java.awt.event.MouseEvent e) {
offsetX += e.getX() - dragStartX;
offsetY += e.getY() - dragStartY;
dragStartX = e.getX();
dragStartY = e.getY();
repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (image != null) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.drawImage(image, x, y, drawWidth,
drawHeight, null);
}
}
}
infoPanel.add(nameLabel);
infoPanel.add(resolutionLabel);
previewDialog.add(infoPanel, BorderLayout.NORTH);
zoomPanel.add(zoomInButton);
zoomPanel.add(zoomOutButton);
zoomPanel.add(fitToWindowButton);
previousButton.addActionListener(e -> {
if (imageIndex > 0) {
previewDialog.dispose();
showImagePreview(imageList.get(imageIndex - 1),
imageNames.get(imageIndex - 1), imageIndex - 1, imageList,
imageNames);
}
});
nextButton.addActionListener(e -> {
if (imageIndex < imageList.size() - 1) {
previewDialog.dispose();
showImagePreview(imageList.get(imageIndex + 1),
imageNames.get(imageIndex + 1), imageIndex + 1, imageList,
imageNames);
}
});
controlPanel.add(previousButton, BorderLayout.WEST);
controlPanel.add(zoomPanel, BorderLayout.CENTER);
controlPanel.add(nextButton, BorderLayout.EAST);
previewDialog.add(controlPanel, BorderLayout.SOUTH);
public JThrobber() {
setPreferredSize(new Dimension(40, 40));
start(); // Ensure the timer starts when the throbber
is created
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setStroke(new BasicStroke(3));
g2.setColor(Color.BLUE);
g2.drawArc(x, y, size, size, angle, 120);
g2.drawArc(x, y, size, size, angle + 180, 120);
g2.dispose();
}
if (chooser.showOpenDialog(this) ==
JFileChooser.APPROVE_OPTION) {
JThrobber throbber = new JThrobber();
JDialog loadingDialog = createLoadingDialog("Loading
images...", throbber);
@Override
protected void process(List<File> chunks) {
for (File file : chunks) {
addImageThumbnail(file, imagePanel,
fileList, isDecryption);
}
}
@Override
protected void done() {
SwingUtilities.invokeLater(() -> {
loadingDialog.dispose();
throbber.stop();
});
}
};
if (isDecryption) {
leftHeader = "Encrypted Image";
try {
byte[] fileBytes =
Files.readAllBytes(file.toPath());
origImg = encryptedBytesToImage(fileBytes, 100,
100); // Set thumbnail size to 100x100
} catch (Exception ex) {
origImg = null;
}
} else {
leftHeader = "Original Image";
try {
origImg = ImageIO.read(file); // Load full-quality
image
} catch (Exception ex) {
origImg = null;
}
}
rightPanel.setBorder(BorderFactory.createLineBorder(Color.BLUE,
1));
rightPanel.setPreferredSize(new Dimension(100, 100)); //
Match thumbnail size
if (!isDecryption) {
rightPreviewPanelMapEnc.put(file, rightPanel);
}
if (isDecryption) {
previewPanelMapDec.put(file, container);
} else {
previewPanelMapEnc.put(file, container);
}
JOptionPane.showMessageDialog(ImageEncryptionGUI.this,
"Error loading image: " +
ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}
} else {
JOptionPane.showMessageDialog(ImageEncryptionGUI.this,
"File not found or unsupported
format.", "Error", JOptionPane.ERROR_MESSAGE);
}
}
}
});
imagePanel.add(container);
imagePanel.revalidate();
imagePanel.repaint();
}
@Override
protected Void doInBackground() {
for (File file : selectedImages) {
try {
byte[] fileData =
Files.readAllBytes(file.toPath());
byte[] encryptedData =
encryptFile(fileData, password);
encryptedDataMap.put(file, encryptedData);
processedFiles++;
publish((int) ((processedFiles / (double)
totalFiles) * 100));
} catch (Exception ex) {
SwingUtilities.invokeLater(() ->
JOptionPane.showMessageDialog(ImageEncryptionGUI.this,
"Error encrypting " +
file.getName() + ": " + ex.getMessage(),
"Encryption Error",
JOptionPane.ERROR_MESSAGE)
);
}
}
return null;
}
@Override
protected void process(List<Integer> chunks) {
encryptionProgress.setValue(chunks.get(chunks.size() - 1));
}
@Override
protected void done() {
long endTime = System.nanoTime(); // End time
long duration = (endTime - startTime) / 1_000_000;
// Convert to milliseconds
encryptionTimeLabel.setText("Encryption Time: " +
duration + " ms");
loadingDialog.dispose();
throbber.stop();
updateEncryptionThumbnails();
statusBar.setText("Status: Encryption complete");
}
};
worker.execute();
}
Image scaled =
decryptedImg.getScaledInstance(100, 100, Image.SCALE_SMOOTH);
BufferedImage scaledBuffered = new
BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
scaledBuffered.getGraphics().drawImage(scaled, 0, 0, null);
publish(new DecryptedResult(file,
decryptedData, scaledBuffered));
setProgress((int) ((++index / (double)
count) * 100));
} catch (Exception ex) {
SwingUtilities.invokeLater(() ->
JOptionPane.showMessageDialog(ImageEncryptionGUI.this,
"Error decrypting " +
file.getName() + ": " + ex.getMessage(),
"Decryption Error",
JOptionPane.ERROR_MESSAGE)
);
}
}
return null;
}
@Override
protected void process(List<DecryptedResult> chunks) {
for (DecryptedResult result : chunks) {
JPanel container =
previewPanelMapDec.get(result.file);
if (container != null) {
// Create a new right-side thumbnail for
the decrypted image
String decName =
addPrefixIfNeeded("Decrypted_", result.file.getName());
File dummyDecFile = new File(decName);
JPanel newRightPanel =
createColumnPanel("Decrypted Image",
new
ImageIcon(result.decryptedImage),
createFileInfoLabel(dummyDecFile,
result.decryptedData.length));
@Override
protected void done() {
long endTime = System.nanoTime(); // End time
long duration = (endTime - startTime) / 1_000_000;
// Convert to milliseconds
decryptionTimeLabel.setText("Decryption Time: " +
duration + " ms");
loadingDialog.dispose();
throbber.stop();
statusBar.setText("Status: Decryption complete");
}
};
worker.addPropertyChangeListener(evt -> {
if ("progress".equals(evt.getPropertyName())) {
decryptionProgress.setValue(worker.getProgress());
}
});
worker.execute();
}
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
if
(chooser.showSaveDialog(ImageEncryptionGUI.this) ==
JFileChooser.APPROVE_OPTION) {
File dir = chooser.getSelectedFile();
for (File file : selectedImages) {
byte[] encryptedData =
encryptedDataMap.get(file);
if (encryptedData != null) {
String encName =
addPrefixIfNeeded("Encrypted_", file.getName());
File outFile = new File(dir, encName +
".enc");
try (FileOutputStream fos = new
FileOutputStream(outFile)) {
fos.write(encryptedData);
} catch (Exception ex) {
SwingUtilities.invokeLater(() ->
JOptionPane.showMessageDialog(ImageEncryptionGUI.this,
"Error saving encrypted
file for " + file.getName())
);
}
}
}
}
return null;
}
@Override
protected void done() {
loadingDialog.dispose();
throbber.stop();
SwingUtilities.invokeLater(() ->
JOptionPane.showMessageDialog(ImageEncryptionGUI.this, "Encrypted
images saved successfully.")
);
}
};
worker.execute();
}
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
if
(chooser.showSaveDialog(ImageEncryptionGUI.this) ==
JFileChooser.APPROVE_OPTION) {
File dir = chooser.getSelectedFile();
for (File file : selectedEncryptedFiles) {
byte[] decryptedData =
decryptedDataMap.get(file);
if (decryptedData != null) {
BufferedImage decryptedImg = null;
try {
decryptedImg = ImageIO.read(new
ByteArrayInputStream(decryptedData));
} catch (Exception ex) {}
String originalName = file.getName();
if
(originalName.toLowerCase().startsWith("encrypted_")) {
originalName =
originalName.substring("encrypted_".length());
}
if
(originalName.toLowerCase().endsWith(".enc")) {
originalName =
originalName.substring(0, originalName.length() - 4);
}
String saveName =
addPrefixIfNeeded("Decrypted_", originalName);
if (decryptedImg != null) {
File outFile = new File(dir,
saveName);
try {
ImageIO.write(decryptedImg,
"png", outFile);
} catch (Exception ex) {
SwingUtilities.invokeLater(()
->
JOptionPane.showMessageDialog(ImageEncryptionGUI.this,
"Error saving
decrypted file for " + file.getName())
);
}
} else {
File outFile = new File(dir,
saveName + ".bin");
try (FileOutputStream fos = new
FileOutputStream(outFile)) {
fos.write(decryptedData);
} catch (Exception ex) {
SwingUtilities.invokeLater(()
->
JOptionPane.showMessageDialog(ImageEncryptionGUI.this,
"Error saving
decrypted file for " + file.getName())
);
}
}
}
}
}
return null;
}
@Override
protected void done() {
loadingDialog.dispose();
throbber.stop();
SwingUtilities.invokeLater(() ->
JOptionPane.showMessageDialog(ImageEncryptionGUI.this, "Decrypted
images saved successfully.")
);
}
};
worker.execute();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (image != null) {
int drawWidth, drawHeight;
if (fitToWindow) {
// Scale image to panel size.
drawWidth = getWidth();
drawHeight = getHeight();
} else {
drawWidth = (int) (DEFAULT_WIDTH * scale);
drawHeight = (int) (DEFAULT_HEIGHT * scale);
}
int x = (getWidth() - drawWidth) / 2;
int y = (getHeight() - drawHeight) / 2; // Fixed
typo: replaced drawHeight() with drawHeight
Graphics2D g2 = (Graphics2D) g;
// Use high-quality rendering hints for best image
quality
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g2.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.drawImage(image, x, y, drawWidth, drawHeight,
this);
}
}
}
aboutDialog.setVisible(true);
}