前言:

    因為專案需求,所以做了一個簡易的加解密Frame程式,方便對文件做加解密的動作。

 

Code如下

 

==============MainFrame.java==============

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
* 加解密程式主要介面
*
* @author Shan
*
*/
public class MainFrame extends JFrame {

private JPanel mainPanel;
private JLabel textLabel;
private JButton selectFileButton;
private JButton encButton;
private JButton desButton;
private JFileChooser fileChooser;

private void initMainJFrame(){

setTitle("加解密程式");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setSize(500, 150);

mainPanel = new JPanel();

textLabel = new JLabel("你選擇的檔案 : ");
selectFileButton = new JButton("選擇檔案");
encButton = new JButton("加密");
desButton = new JButton("解密");

mainPanel.add(textLabel);
mainPanel.add(selectFileButton);
mainPanel.add(encButton);
mainPanel.add(desButton);

selectFileButton.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {

fileChooser = new JFileChooser();

fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
fileChooser.setApproveButtonText("開啟");
fileChooser.setMultiSelectionEnabled(true);
fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);

int returnVal = fileChooser.showOpenDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION) {
textLabel.setText("你選擇的檔案 : " + fileChooser.getSelectedFile().getAbsolutePath());
}
}
});

encButton.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {

if(fileChooser != null && fileChooser.getSelectedFile().exists()){
EncryptionUtils encUtils = new EncryptionUtils();
encUtils.encFile(fileChooser.getSelectedFile().getAbsolutePath());
JOptionPane.showMessageDialog(null,"加密完成","加密完成", JOptionPane.INFORMATION_MESSAGE);
}else
JOptionPane.showMessageDialog(null,"尚未選擇檔案","請選擇一個文字檔", JOptionPane.INFORMATION_MESSAGE);
}
});

desButton.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {

if(fileChooser != null && fileChooser.getSelectedFile().exists()){
EncryptionUtils desUtils = new EncryptionUtils();
desUtils.desFile(fileChooser.getSelectedFile().getAbsolutePath());
JOptionPane.showMessageDialog(null,"解密完成","加密完成", JOptionPane.INFORMATION_MESSAGE);
}else
JOptionPane.showMessageDialog(null,"尚未選擇檔案","請選擇一個文字檔", JOptionPane.INFORMATION_MESSAGE);
}
});
setVisible(true);
getContentPane().add(mainPanel);
mainPanel.setLayout(new LayoutManager() {

@Override
public void removeLayoutComponent(Component comp) {

}

@Override
public Dimension preferredLayoutSize(Container parent) {
return null;
}

@Override
public Dimension minimumLayoutSize(Container parent) {
return null;
}

@Override
public void layoutContainer(Container parent) {
textLabel.setBounds(10, 10, 500, 20);
selectFileButton.setBounds(20, 40, 140, 20);
encButton.setBounds(180, 40, 140, 20);
desButton.setBounds(340, 40, 140, 20);
}

@Override
public void addLayoutComponent(String name, Component comp) {

}
});
}

public static void main(String[] args){
MainFrame test = new MainFrame();
test.initMainJFrame();
}
}

 

 

 

==============EncryptionUtils.java==============


import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.security.Key;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;


public class EncryptionUtils {

private boolean isEnc = true; //加密開關
private String cryptionStr = "shacom";
private Key key;

public EncryptionUtils(){
this.getKey(cryptionStr);
}

/**
* 加密
*
* @param strMing
* @return
*/
public String getEncString(String strMing){

if(!isEnc)
return strMing;

byte[] byteMi = null;
byte[] byteMing = null;

String strMi = null;

BASE64Encoder base64Encoder = new BASE64Encoder();

try{
byteMing = strMing.getBytes("UTF-8");

byteMi = getEncCode(byteMing);
strMi = base64Encoder.encode(byteMi);

}catch(Exception e){
System.out.println("getEncString error" + e.getMessage());
}
return strMi;
}

/**
* 解密
*
* @param strMi
* @return
*/
public String getDesString(String strMi){

BASE64Decoder base64Decoder = new BASE64Decoder();

byte[] byteMing = null;
byte[] byteMi = null;

String strMing = null;

try{
byteMi = base64Decoder.decodeBuffer(strMi);
byteMing = getDesCode(byteMi);

strMing = new String(byteMing, "UTF-8");

}catch(Exception e){
System.out.println("getDesString error" + e.getMessage());
}

return strMing;
}


private byte[] getEncCode(byte[] byteMing) {

if(!isEnc)
return byteMing;

Cipher cipher;
byte[] byteFina = null;

try{
cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);

byteFina = cipher.doFinal(byteMing);

}catch (Exception e) {
System.out.println("getEncCode error : " + e.getMessage());
}

return byteFina;
}

private byte[] getDesCode(byte[] byteMi) {

Cipher cipher;
byte[] byteFina = null;

try{
cipher = Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE, key);

byteFina = cipher.doFinal(byteMi);

}catch (Exception e) {
System.out.println("getDesCode error : " + e.getMessage());
e.printStackTrace();
}

return byteFina;
}

private void getKey(String keyStr){

try{
KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");

// keyGenerator.init(new SecureRandom(keyStr.getBytes()));

//linux環境下 key值每次隨機變更解法 modify by Shan 2013/09/13
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(keyStr.getBytes("UTF-8"));
keyGenerator.init(secureRandom);

this.key = keyGenerator.generateKey();

}catch (Exception e) {
System.out.println("getKey error : " + e.getMessage());
}
}

/**
* 整份檔案加密,產出.enc加密檔
*
* @param filePath
*/
public void encFile(String filePath){

if(!isEnc)
return;

System.out.println("encFile: " + filePath);

File file = new File(filePath);

String encFileName = file.getName();

if(encFileName.indexOf(".") > -1)
encFileName = "/" + encFileName.split("\\.")[0] + ".enc";

File encFile = new File(file.getParent() + encFileName);

FileReader fr = null;
BufferedReader br = null;

FileWriter fw;

StringBuffer sb = new StringBuffer();

try{
fr = new FileReader(file);
br = new BufferedReader(fr);

String line = null;

while((line = br.readLine()) != null){
sb.append(line);
}
String encStr = getEncString(sb.toString());

fw = new FileWriter(encFile, false);
fw.write(encStr);
fw.flush();

} catch (Exception e) {
e.printStackTrace();
}
}

public String desFile(String filePath){

System.out.println("desFile: " + filePath);

File file = new File(filePath);

FileReader fr = null;
BufferedReader br = null;

FileWriter fw;
String desFileName = "";

StringBuffer sb = new StringBuffer();

try{
fr = new FileReader(file);
br = new BufferedReader(fr);

String line = null;

while((line = br.readLine()) != null){
sb.append(line);
}
String desFile = getDesString(sb.toString());

desFileName = file.getName().split("\\.")[0] + ".xml";

fw = new FileWriter(file.getParent() + "/" + desFileName, false);
fw.write(desFile);
fw.flush();
} catch (Exception e) {
e.printStackTrace();
}
return file.getParent() + "/" + desFileName;
}

public void desFile(String filePath, String extension){

System.out.println("desFile: " + filePath);

File file = new File(filePath);

FileReader fr = null;
BufferedReader br = null;

FileWriter fw;

StringBuffer sb = new StringBuffer();

try{
fr = new FileReader(file);
br = new BufferedReader(fr);

String line = null;

while((line = br.readLine()) != null){
sb.append(line);
}
String desFile = getDesString(sb.toString());

String desFileName = file.getName().split("\\.")[0] + "." + extension;

fw = new FileWriter(file.getParent() + "/" + desFileName, false);
fw.write(desFile);
fw.flush();

} catch (Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args){

}
}

 

======================================

因為臨時寫的,很多註解以及細節都沒有處理得很好,等有時間再來做優化。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 小山 的頭像
    小山

    小山的JAVA世界

    小山 發表在 痞客邦 留言(0) 人氣()