0

我编写了一个代码,它以秒为单位计算文件的聚合加密和解密时间。也许代码效率不高,因为以秒为单位的时间不断变化。例如:一个 60MB 的文件需要 13 秒。但有时它需要更少的时间。我想找到 AES 加密+解密所用的准确时间,因为我想进一步推进这个项目并比较 AES 和其他算法所用的持续时间。是定时器的问题吗?还是我放错地方了?- 谢谢。我在下面粘贴我的代码:

import java.awt.Container;
import java.awt.event.*;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JTextField;
import java.io.File;
import javax.swing.JFileChooser;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.KeyGenerator;

import java.security.NoSuchAlgorithmException;
import java.security.spec.AlgorithmParameterSpec;

public class BrowseListener extends JFrame {

private JButton btn ;
private JTextField textField;
private JTextField textF;
private static JFileChooser fc;
Cipher ecipher;
Cipher dcipher;

private long startTime = 0;
private long stopTime = 0;
private boolean running = false;

public void start() {
    this.startTime = System.currentTimeMillis();
    this.running = true;
}


public void stop() {
    this.stopTime = System.currentTimeMillis();
    this.running = false;
}

//elaspsed time in seconds
public long getElapsedTimeSecs() {
    long elapsed;
    if (running) {
        elapsed = ((System.currentTimeMillis() - startTime) / 1000);
    }
    else {
        elapsed = ((stopTime - startTime) / 1000);
    }
    return elapsed;
}

public BrowseListener(SecretKey key)
{
    // Create an 8-byte initialization vector
    byte[] iv = new byte[]
    {
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
0x07, 0x08, 0x09,0x0a,            0x0b, 0x0c,
0x0d, 0x0e, 0x0f
    };

    AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
    try
    {
        ecipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        dcipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

        // CBC requires an initialization vector
        ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
        dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

// Buffer used to transport the bytes from one stream to another
    byte[] buf = new byte[1024];

    public void encrypt(InputStream in, OutputStream out)
    {
        try
        {
            // Bytes written to out will be encrypted
            out = new CipherOutputStream(out, ecipher);

            // Read in the cleartext bytes and write to out to encrypt
            int numRead = 0;
            while ((numRead = in.read(buf)) >= 0)
            {
                out.write(buf, 0, numRead);
            }
            out.close();
        }
        catch (java.io.IOException e)
        {
        }
    }

    public void decrypt(InputStream in, OutputStream out)
    {
        try
        {
            // Bytes read from in will be decrypted
            in = new CipherInputStream(in, dcipher);

        // Read in the decrypted bytes and write the cleartext to out
            int numRead = 0;
            while ((numRead = in.read(buf)) >= 0)
            {
                out.write(buf, 0, numRead);
            }
            out.close();
        }
        catch (java.io.IOException e)
        {
        }
    }

public BrowseListener() {
    initComponents();
    simpleMethod();
}

private void initComponents() {
    setSize(300, 60);
    setTitle("My Window");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container c = getContentPane();
    c.setLayout(new FlowLayout());
    btn = new JButton("Browse");
    btn.setPreferredSize(new Dimension(100, 20));
    c.add(btn);
    textField = new JTextField();
    textField.setPreferredSize(new Dimension(160, 20));
    c.add(textField);
    textF = new JTextField();
    textF.setPreferredSize(new Dimension(160, 20));
    c.add(textF);
}

private void simpleMethod() {
    btn.addActionListener(new java.awt.event.ActionListener() {
        @Override
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            try {
                btnBrowseActionPerformed(evt);
            } catch (NoSuchAlgorithmException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
}

private void btnBrowseActionPerformed(java.awt.event.ActionEvent evt)
throws   NoSuchAlgorithmException, FileNotFoundException {                                               
    if (fc == null) {
        fc = new JFileChooser(".");
    }
    // Show it.
    int returnVal = fc.showOpenDialog(this);

    // Process the results.
    if (returnVal == JFileChooser.APPROVE_OPTION) {
        textField.setText(fc.getSelectedFile().getPath());

        KeyGenerator    kgen    =   KeyGenerator.getInstance("AES");
        kgen.init(128);
        SecretKey key           =   kgen.generateKey();

        // Create encrypter/decrypter class
        BrowseListener encrypter = new BrowseListener(key);


       BrowseListener s = new BrowseListener();

        s.start(); // timer starts
        encrypter.encrypt(new FileInputStream(fc.getSelectedFile().getPath()),
new  FileOutputStream("C:/Users/Acer/Desktop/encrypted"));
        // Decrypt
        encrypter.decrypt
(new FileInputStream("C:/Users/Acer/Desktop/encrypted"),
new FileOutputStream("C:/Users/Acer/Desktop/decrypted"));
        s.stop(); // timer stops

        textF.setText(Long.toString(s.getElapsedTimeSecs()));

    } else {
        textField.setText("");
    }

    // Reset the file chooser for the next time it's shown.
    fc.setSelectedFile(null);

}  
public static void main(String[] args) throws 
NoSuchAlgorithmException, FileNotFoundException {

    BrowseListener s = new BrowseListener();
    BrowseListener window = new BrowseListener();
    window.setVisible(true);
}
}
4

0 回答 0