List of Topics:
Location Research Breakthrough Possible @S-Logix pro@slogix.in

Office Address

Social List

How to Encrypt and Decrypt Data using AES in Java ?

Encrypt and Decrypt data using AES in Java

Condition for Encrypt and Decrypt data using AES in Java

  • Description:
    AES (Advanced Encryption Standard) is a symmetric encryption algorithm that uses the same key for both encryption and decryption. It processes data in fixed-size blocks of 128 bits with key sizes of 128, 192, or 256 bits. In Java, the Cipher class performs encryption and decryption using the AES transformation. The KeyGenerator or SecretKeySpec class generates or specifies the secret key.

    During encryption, plaintext is converted into ciphertext, and decryption reverses this. The encrypted data and key must remain confidential to ensure security. File I/O operations handle reading plaintext, encrypting it, and writing ciphertext to a file. Exception handling is necessary to address errors that may arise during the process.
Sample Code
  • Encryption:
    package symmetric;

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.util.Base64;
    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.swing.JFileChooser;
    import javax.swing.JOptionPane;

    public class AES_Alg_Encryption extends javax.swing.JFrame {

    private int result;
    private SecretKey serverSecretKey;
    private String keyFilePath = "/home/soft20/NetBeansProjects/AES/secret.key";

    public AES_Alg_Encryption() {
    initComponents();

    serverSecretKey = loadSecretKey(keyFilePath);
    }

    @SuppressWarnings("unchecked")
    private void initComponents() {
    // ... (GUI initialization code)
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    JFileChooser fileChooser = new JFileChooser();
    fileChooser.setDialogTitle("Choose a file");
    result = fileChooser.showOpenDialog(this);

    if (result == JFileChooser.APPROVE_OPTION) {
    File selectedFile = fileChooser.getSelectedFile();
    jTextField1.setText(selectedFile.getAbsolutePath());
    } else {
    jTextField1.setText("No File Selected ");
    }
    }

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
    String inputFilePath = jTextField1.getText();
    String outputFilePath = jTextField2.getText();

    try {
    encrypt(inputFilePath, outputFilePath, serverSecretKey);
    JOptionPane.showMessageDialog(this, "File encrypted successfully.");
    } catch (Exception e) {
    System.out.println(e.getMessage());
    }
    }

    private void encrypt(String inputFilePath, String outputFilePath, SecretKey serverSecretKey) {
    try {
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, serverSecretKey);

    byte[] plainText = readFile(inputFilePath);
    byte[] encryptedData = cipher.doFinal(plainText);

    try (FileOutputStream fos = new FileOutputStream(outputFilePath)) {
    fos.write(encryptedData);
    }

    System.out.println("Encryption successful. Encrypted text saved to: " + outputFilePath);
    } catch (Exception e) {
    JOptionPane.showMessageDialog(this, "Error during encryption: " + e.getMessage());
    }
    }

    private byte[] readFile(String inputFilePath) throws Exception {
    File file = new File(inputFilePath);
    byte[] data = new byte[(int) file.length()];
    try (FileInputStream fis = new FileInputStream(file)) {
    fis.read(data);
    }
    return data;
    }

    private SecretKey loadSecretKey(String keyFilePath) {
    try (FileInputStream fis = new FileInputStream(keyFilePath)) {
    byte[] keyBytes = new byte[(int) new File(keyFilePath).length()];
    fis.read(keyBytes);
    byte[] decodedKey = Base64.getDecoder().decode(keyBytes);
    return new javax.crypto.spec.SecretKeySpec(decodedKey, "AES");
    } catch (Exception e) {
    JOptionPane.showMessageDialog(this, "Error loading secret key: " + e.getMessage());
    return null;
    }
    }
    }
  • Decryption:
    package symmetric;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.util.Base64;
    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;
    import javax.swing.JFileChooser;
    import javax.swing.JOptionPane;
    public class AES_Alg_Decryption extends javax.swing.JFrame {
    private int result;
    private SecretKey secretKey;
    private String keyFilePath = "/home/soft20/NetBeansProjects/AES/secret.key";
    public AES_Alg_Decryption() {
    initComponents();
    try {
    KeyGenerator keyGen = KeyGenerator.getInstance("AES");
    keyGen.init(128);
    secretKey = keyGen.generateKey();
    saveSecretKey(secretKey, keyFilePath);
    } catch (Exception e) {
    System.out.println(e.getMessage());
    }
    }
    @SuppressWarnings("unchecked")
    private void initComponents() {
    jLabel1 = new javax.swing.JLabel();
    jLabel2 = new javax.swing.JLabel();
    jLabel3 = new javax.swing.JLabel();
    jTextField1 = new javax.swing.JTextField();
    jButton1 = new javax.swing.JButton();
    jTextField2 = new javax.swing.JTextField();
    jButton2 = new javax.swing.JButton();
    jButton3 = new javax.swing.JButton();
    jScrollPane1 = new javax.swing.JScrollPane();
    jTextArea1 = new javax.swing.JTextArea();
    jButton4 = new javax.swing.JButton();
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    jLabel1.setText("AES_ALGORITHM_DECRYPTION");
    jLabel2.setText("File Path");
    jLabel3.setText("File Path");
    jButton1.setText("Choose File");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
    jButton1ActionPerformed(evt);
    }
    });
    jButton2.setText("Choose File");
    jButton2.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
    jButton2ActionPerformed(evt);
    }
    });
    jButton3.setText("Decrypt");
    jButton3.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
    jButton3ActionPerformed(evt);
    }
    });
    jTextArea1.setColumns(20);
    jTextArea1.setRows(5);
    jScrollPane1.setViewportView(jTextArea1);
    jButton4.setText("Secret Key");
    jButton4.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
    jButton4ActionPerformed(evt);
    }
    });
    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
    layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(layout.createSequentialGroup()
    .addGap(29, 29, 29)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
    .addComponent(jLabel3)
    .addComponent(jLabel2))
    .addGap(32, 32, 32)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(layout.createSequentialGroup()
    .addComponent(jButton3)
    .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
    .addGroup(layout.createSequentialGroup()
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(layout.createSequentialGroup()
    .addGap(81, 81, 81)
    .addComponent(jButton1)
    .addGap(0, 0, Short.MAX_VALUE))
    .addComponent(jTextField2)
    .addComponent(jTextField1, javax.swing.GroupLayout.Alignment.TRAILING))
    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
    .addGap(80, 80, 80)
    .addComponent(jButton2)
    .addGap(89, 89, 89)))
    .addComponent(jLabel1))
    .addGap(74, 74, 74))))
    .addGroup(layout.createSequentialGroup()
    .addGap(21, 21, 21)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 395, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addGroup(layout.createSequentialGroup()
    .addGap(128, 128, 128)
    .addComponent(jButton4)))
    .addGap(0, 0, Short.MAX_VALUE))
    );
    layout.setVerticalGroup(
    layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(layout.createSequentialGroup()
    .addGap(29, 29, 29)
    .addComponent(jLabel1)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(layout.createSequentialGroup()
    .addGap(39, 39, 39)
    .addComponent(jLabel2))
    .addGroup(layout.createSequentialGroup()
    .addGap(27, 27, 27)
    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
    .addComponent(jButton1)
    .addGap(12, 12, 12)
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
    .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addComponent(jLabel3))
    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
    .addComponent(jButton2)))
    .addGap(18, 18, 18)
    .addComponent(jButton3)
    .addGap(33, 33, 33)
    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 53, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addGap(18, 18, 18)
    .addComponent(jButton4)
    .addContainerGap(32, Short.MAX_VALUE))
    );
    pack();
    }//
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    JFileChooser fileChooser = new JFileChooser();
    fileChooser.setDialogTitle("Choose a file");
    result = fileChooser.showOpenDialog(this);
    if (result == JFileChooser.APPROVE_OPTION) {
    File selectedFile = fileChooser.getSelectedFile();
    jTextField1.setText(selectedFile.getAbsolutePath());
    } else {
    jTextField1.setText("No File Selected ");
    }
    }
    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
    JFileChooser fileChooser = new JFileChooser();
    fileChooser.setDialogTitle("Choose a file");
    result = fileChooser.showOpenDialog(this);
    if (result == JFileChooser.APPROVE_OPTION) {
    File selectedFile = fileChooser.getSelectedFile();
    jTextField2.setText(selectedFile.getAbsolutePath());
    } else {
    jTextField2.setText("No File Selected ");
    }
    }
    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
    String inputFilePath = jTextField1.getText();
    String outputFilePath = jTextField2.getText();
    try {
    decrypt(inputFilePath, outputFilePath, secretKey);
    JOptionPane.showMessageDialog(this, "File decrypted successfully.");
    } catch (Exception e) {
    System.out.println(e.getMessage());
    }
    }
    private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
    display();
    }
    public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(() -> {
    new AES_Alg_Decryption().setVisible(true);
    });
    }
    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JButton jButton4;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextArea1;
    private javax.swing.JTextField jTextField1;
    private javax.swing.JTextField jTextField2;
    // End of variables declaration
    private void decrypt(String inputFilePath, String outputFilePath, SecretKey secretKey) {
    try {
    byte[] encryptedData = readFile(inputFilePath);
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, secretKey);
    byte[] decryptedData = cipher.doFinal(encryptedData);
    try (FileOutputStream fos = new FileOutputStream(outputFilePath)) {
    fos.write(decryptedData);
    }
    System.out.println("Decryption complete. Decrypted data saved to " + outputFilePath);
    } catch (Exception e) {
    System.out.println(e.getMessage());
    }
    }
    private byte[] readFile(String inputFilePath) throws Exception {
    File file = new File(inputFilePath);
    byte[] data = new byte[(int) file.length()];
    try (FileInputStream fis = new FileInputStream(file)) {
    fis.read(data);
    }
    return data;
    }
    private void saveSecretKey(SecretKey secretKey, String keyFilePath) throws Exception {
    try (FileOutputStream fos = new FileOutputStream(keyFilePath)) {
    byte[] keyBytes = secretKey.getEncoded();
    fos.write(Base64.getEncoder().encode(keyBytes));
    fos.flush();
    System.out.println("Secret key saved to: " + keyFilePath);
    } catch (Exception e) {
    JOptionPane.showMessageDialog(this, "Error saving secret key: " + e.getMessage());
    }
    }
    private void display() {
    try {
    byte[] publicKeyBytes = secretKey.getEncoded();
    String res = Base64.getEncoder().encodeToString(publicKeyBytes);
    jTextArea1.setText(res);
    } catch (Exception e) {
    System.out.println(e.getMessage());
    }
    }
    }
Step 1
  • To start the encryption process, select the input file path after setting up the AES encryption GUI.
  • Encrypt and Decrypt data using AES1
  • Encrypt and Decrypt data using AES2
Step 2
  • The chosen file location is indicated by the selected file path that shows up in the text field.
  • Encrypt and Decrypt data using AES3
Step 3
  • Select the path of the 'Encrypt.txt' file to begin the encryption process.
  • Encrypt and Decrypt data using AES4
Step 4
  • The path of the 'Encrypt.txt' file has been selected for encryption.
  • Encrypt and Decrypt data using AES5
Step 5
  • The files Encrypt.txt and input.txt are chosen. When the Encrypt button is clicked, encryption is successfully finished.
  • Encrypt and Decrypt data using AES6
Step 6
  • To start the decryption process, select the input file path after setting up the AES decryption GUI.
  • Encrypt and Decrypt data using AES7
  • Encrypt and Decrypt data using AES8
Step 7
  • The chosen file location is indicated by the selected file path that shows up in the text field.
  • Encrypt and Decrypt data using AES9
Step 8
  • Select the path of the 'Decrypt.txt' file to begin the decryption process.
  • Encrypt and Decrypt data using AES10
Step 9
  • The path of the 'Decrypt.txt' file has been selected for decryption.
  • Encrypt and Decrypt data using AES11
Step 10
  • The files Encrypt.txt and Decrypt.txt are chosen. When the Decrypt button is clicked, decryption is successfully finished.
  • Encrypt and Decrypt data using AES12
Step 11
  • Use the same secret key for both encryption and decryption to maintain consistency and ensure accurate data retrieval.
  • Encrypt and Decrypt data using AES13
  • Encrypt and Decrypt data using AES14
  • Encrypt and Decrypt data using AES15
Step 12
  • Encryption applies to the input text file, with the result saved in the encrypt text file. Decryption restores the original content from the decrypt text file.
  • Encrypt and Decrypt data using AES16
  • Encrypt and Decrypt data using AES17
  • Encrypt and Decrypt data using AES18