0

I am trying to create an application that utilizes a textfield that allows a user to save a file or load the existing text of the file specified in the program. Without the Jasypt library calls, the program works fine. However, my ultimate goal is to save the text entered as encrypted text in the txt file, and when the file is read into the textfield, it is decrypted. My save portion of the program works fine. However, my load event does not work properly.

My program looks like this:

import java.awt.*;
import java.awt.event.*;
import java.io.*;

import javax.swing.*;

import org.jasypt.util.password.StrongPasswordEncryptor;
import org.jasypt.util.text.*;

public class CheesyWP extends JFrame implements ActionListener {
    StrongTextEncryptor textEncryptor = new StrongTextEncryptor();
    /**
     * @param args
     */
    Panel center;
    Panel south;
    JMenuItem save;
    JMenuItem load;
    JMenuItem clip;
    JMenuItem finish;
    TextArea ta;

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        CheesyWP cwp = new CheesyWP();
        cwp.doIt();

    }

    public void doIt() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(1000, 400);
        center = new Panel();
        south = new Panel();
        clip = new JMenuItem("Open Clipboard");
        save = new JMenuItem("Save");
        load = new JMenuItem("Load");
        finish = new JMenuItem("Finish");

        JMenuBar j = new JMenuBar();


        JMenu option = new JMenu("Options");

        j.add(option);
        option.add(clip);
        option.add(save);
        option.add(load);
        option.add(finish);

        setJMenuBar(j);



        clip.addActionListener(this);
        save.addActionListener(this);
        load.addActionListener(this);
        finish.addActionListener(this);
        ta = new TextArea(20, 80);
        center.add(ta);

        /*south.add(load);
        south.add(save);
        south.add(clip);
        south.add(finish);*/

        this.add(center, BorderLayout.CENTER);
        this.add(south, BorderLayout.SOUTH);
        this.setSize(600, 300);
        this.setVisible(true);
    }

    public void actionPerformed(ActionEvent ae) {
        if (ae.getSource() == save) {
            try {
                File junk = new File("junk.txt");
                FileWriter fw = new FileWriter(junk);

                String text = ta.getText();
                textEncryptor.setPassword(text);
                String myEncryptedText = textEncryptor.encrypt(text);
                fw.write(myEncryptedText); // write whole TextArea contents
                fw.close();
            } catch (IOException ioe) {
            }
        }// ends if
        if (ae.getSource() == load) {
            StrongTextEncryptor textEncryptor = new StrongTextEncryptor();
            String temp = "";
            try {
                File junk = new File("junk.txt");
                FileReader fr = new FileReader(junk);

                BufferedReader br = new BufferedReader(fr);
                String decrypt;
                while ((temp = br.readLine()) != null) {
                    textEncryptor.setPassword(temp);
                    decrypt = textEncryptor.decrypt(temp);
                    ta.append(decrypt);
                }
                br.close();
            } catch (FileNotFoundException fnfe) {
            } catch (IOException ioe) {
            }
        }
        if (ae.getSource() == finish) {
            System.exit(0);
        }
        if(ae.getSource()==clip){
            new ClipBoard();
        }
    }

    class ClipBoard extends JFrame {
        public ClipBoard() { // a constructor
            this.setTitle("Clipboard");
            this.setLayout(new FlowLayout());
            this.add(new TextArea(10, 50));
            this.setSize(400, 160);
            this.setVisible(true);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
        }
    }
}

When loading I get the following errors:

Exception in thread "AWT-EventQueue-0" org.jasypt.exceptions.EncryptionOperationNotPossibleException
    at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.decrypt(StandardPBEByteEncryptor.java:1055)
    at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.decrypt(StandardPBEStringEncryptor.java:725)
    at org.jasypt.util.text.StrongTextEncryptor.decrypt(StrongTextEncryptor.java:118)
    at CheesyWP.actionPerformed(CheesyWP.java:100)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.AbstractButton.doClick(AbstractButton.java:389)
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:809)
    at com.apple.laf.AquaMenuItemUI.doClick(AquaMenuItemUI.java:137)
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:850)
    at java.awt.Component.processMouseEvent(Component.java:6414)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3275)
    at java.awt.Component.processEvent(Component.java:6179)
    at java.awt.Container.processEvent(Container.java:2084)
    at java.awt.Component.dispatchEventImpl(Component.java:4776)
    at java.awt.Container.dispatchEventImpl(Container.java:2142)
    at java.awt.Component.dispatchEvent(Component.java:4604)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4618)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4279)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4209)
    at java.awt.Container.dispatchEventImpl(Container.java:2128)
    at java.awt.Window.dispatchEventImpl(Window.java:2492)
    at java.awt.Component.dispatchEvent(Component.java:4604)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:717)
    at java.awt.EventQueue.access$400(EventQueue.java:82)
    at java.awt.EventQueue$2.run(EventQueue.java:676)
    at java.awt.EventQueue$2.run(EventQueue.java:674)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:690)
    at java.awt.EventQueue$3.run(EventQueue.java:688)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:687)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Should I be using a class other than StrongTextEncryptor? Should I be using methods other than .encrypt() and .decrypt()?

beckah
  • 1,543
  • 6
  • 28
  • 61

1 Answers1

2

Jasypt uses a password to derive an encryption key used to encrypt and decrypt your data. That's why it should be the same for encrypt and decrypt operations.

What you do in your code is this:

  1. Take a pwd from a field in clear
  2. Setup it as a password in StrongtextEncryptor
  3. Encrypt the password and store it to a file

For decrypting:

  1. You read an encrypted password
  2. Trying to decrypt the data

It means that the encryption keys derived from the password will be different and thus decryption should fail.

Oleg Gryb
  • 5,122
  • 1
  • 28
  • 40