前言:
因為專案需求,所以做了一個簡易的加解密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){
}
}
======================================
因為臨時寫的,很多註解以及細節都沒有處理得很好,等有時間再來做優化。
留言列表