📄 jfilecryptframe.java
字号:
//~--- JDK imports ------------------------------------------------------------
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.security.*;
import java.util.Enumeration;
import java.util.Properties;
import java.util.Vector;
import java.util.zip.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import javax.swing.*;
import javax.swing.event.*;
//~--- classes ----------------------------------------------------------------
public class jFileCryptFrame extends JFrame {
private static final long serialVersionUID = 1L;
private JButton btChoose = new JButton();
private JProgressBar pbCryptProgress = new JProgressBar();
private JPasswordField pfPassword = new JPasswordField();
private JLabel lbAlgorithm = new JLabel();
private JLabel lbSource = new JLabel();
private JTextField tfSourceFile = new JTextField();
private JLabel lbPassword = new JLabel();
private JComboBox cmbAlgorithm = new JComboBox();
private JComboBox cmbCompressionLevel = new JComboBox();
private JButton btDecrypt = new JButton();
private JButton btEncrypt = new JButton();
private JFileChooser fchooser = new JFileChooser();
private JCheckBox chbUseCompression = new JCheckBox();
private Properties prop = new Properties();
private long read = 0;
private int start_for_entry_path = 0;
private String dir_for_encrypted ="";
private long size_all_files = 0;
//~--- constructors -------------------------------------------------------
/**
* This is the main-constructor. It calls the @see jbinit() method.
*/
public jFileCryptFrame() {
super();
try {
jbInit();
} catch (Exception e) {
e.printStackTrace();
}
}
//~--- methods ------------------------------------------------------------
private void decrypt(final File f) {
if(f.isDirectory()) {
File[] files = f.listFiles();
for(int i = 0; i<files.length; i++) {
decrypt(files[i]);
}
} else {
new Thread() {
public void run() {
try {
String kind = (String) cmbAlgorithm.getSelectedItem(); // Which algorithm?
int index = kind.indexOf("(");
kind = kind.substring(0, index);
Cipher c = Cipher.getInstance(kind);
Key k = new SecretKeySpec(
new String(pfPassword.getPassword()).getBytes(), kind);
c.init(Cipher.DECRYPT_MODE, k);
String filename = f.getCanonicalPath();
if(filename.endsWith(prop.getProperty(kind))) {
filename = filename.substring(
0, filename.length()
- prop.getProperty(kind).length()); // -suffix
} else {
displayError("Error: Wrong file chosen",
"Ending of file and chosen algorithm do not match! Filename must end with: " + prop.getProperty(kind));
return;
}
FileInputStream fis =
new FileInputStream(f.getCanonicalPath());
FileOutputStream fos = new FileOutputStream(filename);
CipherInputStream cis = new CipherInputStream(fis, c);
byte[] buffer = new byte[0xFFFF];
final long size = f.length();
pbCryptProgress.setMaximum((int) size);
for (int len; (len = cis.read(buffer)) != -1;) {
fos.write(buffer, 0, len);
read += len;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
pbCryptProgress.setValue((int)read);
pbCryptProgress.repaint();
}
}); // Set Progress
}
cis.close();
fos.flush();
fos.close();
fis.close();
pbCryptProgress.setMaximum(100);
pbCryptProgress.setValue(0);
read = 0;
} catch (Exception x) {
x.printStackTrace();
}
}
}.start();
}
}
private void encrypt(final File f) {
if(f.isDirectory()) {
File[] files = f.listFiles();
for(int i = 0; i<files.length; i++) {
encrypt(files[i]);
}
} else {
new Thread() {
public void run() {
try {
String kind = (String) cmbAlgorithm.getSelectedItem(); // Which algorithm?
int index = kind.indexOf("(");
kind = kind.substring(0, index);
Cipher c = Cipher.getInstance(kind);
Key k = new SecretKeySpec(
new String(pfPassword.getPassword()).getBytes(), kind);
c.init(Cipher.ENCRYPT_MODE, k);
FileInputStream fis =
new FileInputStream(f.getCanonicalPath());
FileOutputStream fos =
new FileOutputStream(f.getCanonicalPath()
+ prop.getProperty(kind));
CipherOutputStream cos = new CipherOutputStream(fos, c);
final int size = (int) f.length();
byte[] buffer = new byte[0xFFFF];
pbCryptProgress.setMaximum(size);
for (int len; (len = fis.read(buffer)) != -1; ) {
cos.write(buffer, 0, len);
read += len;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
pbCryptProgress.setValue((int)read);
pbCryptProgress.repaint();
}
}); // Set Progress
}
cos.flush();
cos.close();
fos.flush();
fos.close();
fis.close();
pbCryptProgress.setMaximum(100);
pbCryptProgress.setValue(0);
read = 0;
} catch (Exception x) {
x.printStackTrace();
}
}
}.start();
}
}
/**
* This method shows a @see javax.swing.JFileChooser and calls then
* the method @see setFileChosen(boolean b).
* @param e
*/
private void btChoose_actionPerformed(ActionEvent e) {
try {
if (fchooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
String path = fchooser.getSelectedFile().getCanonicalPath();
tfSourceFile.setText(path);
}
} catch (IOException ioex) {
}
}
/**
* This method is called by a click of btEncrypt. It calls
* the @see zip_encrypt(final file f, ZipOutputstream zos) or @see encrypt(final File f).
* @param e
*/
private void btEncrypt_actionPerformed(ActionEvent e) {
String path = tfSourceFile.getText();
if(! path.equals("")) { // File chosen?
File file = new File(path);
if(file.exists()) { // Does file exist?
if(chbUseCompression.isSelected()) {
String root_directory = "";
if(file.isFile()) {
root_directory = file.getParent();
} else{
root_directory = file.getPath();
}
start_for_entry_path = root_directory.length();
zipVectorEncrypt(new File(path));
} else {
encrypt(new File(path));
}
} else {
displayError("Error: file does not exist",
"The file you have chosen does not exist: " + path);
}
}
}
/**
* This method is called by a click of btDecrypt. It calls
* the @see zip_decrypt(final file f) or @see decrypt(final File f).
* @param e
*/
private void btDecrypt_actionPerformed(ActionEvent e) {
String path = tfSourceFile.getText();
if(! path.equals("")) { // File chosen?
File file = new File(path);
if(file.exists()) { // Does file exist?
if(chbUseCompression.isSelected()) {
String fname = file.getName();
// check if the suffix of selected file is ".zip"
if(!fname.endsWith("zip")) {
displayError("Error: Not a ZIP-Archive",
"The chosen file is not a ZIP-Archive!");
return;
}
try {
if(!zip_Has_Only_One_File(file)){
File pf = file.getParentFile();
File decrypt_dir = new File(pf,fname.substring(0,fname.length()-4));
decrypt_dir.mkdir();
dir_for_encrypted = decrypt_dir.getPath();
}else{
File pf = file.getParentFile();
dir_for_encrypted = pf.getPath();
}
size_all_files = file.length();
pbCryptProgress.setMaximum((int) size_all_files);
zip_decrypt(new ZipInputStream(new FileInputStream(path)));
} catch (FileNotFoundException f) {}
catch(ZipException zipex){
displayError("Error: Not a valid ZIP-Archive",
"The chosen file is not a valid ZIP-Archive!");
}
catch(IOException ioex){}
} else {
decrypt(new File(path));
}
} else {
displayError("Error: file does not exist",
"The file you have chosen does not exist: " + path);
}
}
}
/**
* This method initialises the GUI.
* @throws Exception
*/
private void jbInit() throws Exception {
this.setTitle("jFileCrypt 0.1.4");
this.setSize(new Dimension(500, 250));
this.setResizable(true);
// setup components
btChoose.setText("Choose File");
btChoose.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
btChoose_actionPerformed(e);
}
});
btEncrypt.setText("Encrypt");
btEncrypt.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
btEncrypt_actionPerformed(e);
}
});
chbUseCompression.setText("Use ZIP-Compression");
chbUseCompression.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
chbUseCompression_stateChanged(e);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -