java 文本文件加密 文本文件解密

来源:互联网 发布:车道线识别算法 编辑:程序博客网 时间:2024/05/16 12:23
import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.io.*;import java.security.*;import javax.crypto.*;import javax.crypto.spec.*;/** * 文件名:FileEncrypter.java JDK:1.40以上 说明:文件加密 加密方法:三重DES加密 * 加密过程:对选中的文件加密后在同文件夹下生成一个增加了".tdes" 扩展名的加密文件 *  * 解密过程:对选中的加密文件(必须有".tdes"扩展名)进行解密 */public class Test extends JFrame {public static final int WIDTH = 550;public static final int HEIGHT = 200;public static void main(String args[]) {Test fe = new Test();fe.show();}Test() {this.setSize(WIDTH, HEIGHT);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setResizable(false);Toolkit tk = Toolkit.getDefaultToolkit();Dimension screenSize = tk.getScreenSize();this.setLocation((screenSize.width - WIDTH) / 2,(screenSize.height - HEIGHT) / 2);this.setTitle("文件加密器(TriDES)");Container c = this.getContentPane();c.setLayout(new FlowLayout());final FilePanel fp = new FilePanel("文件选择");c.add(fp);final KeyPanel pp = new KeyPanel("密码");c.add(pp);JButton jbE = new JButton("加密");c.add(jbE);jbE.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {File file = new File(fp.getFileName());if (file.exists())encrypt(file.getAbsoluteFile(), pp.getKey());elseJOptionPane.showMessageDialog(null, "请选择文件!", "提示",JOptionPane.OK_OPTION);}});JButton jbD = new JButton("解密");c.add(jbD);jbD.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {File file = new File(fp.getFileName());if (file.exists())decrypt(file.getAbsoluteFile(), pp.getKey());elseJOptionPane.showMessageDialog(null, "请选择文件!", "提示",JOptionPane.OK_OPTION);}});}/** * 加密函数 输入: 要加密的文件,密码(由0-F组成,共48个字符,表示3个8位的密码)如: * AD67EA2F3BE6E5ADD368DFE03120B5DF92A8FD8FEC2F0746 其中: AD67EA2F3BE6E5AD * DES密码一 D368DFE03120B5DF DES密码二 92A8FD8FEC2F0746 DES密码三 输出: * 对输入的文件加密后,保存到同一文件夹下增加了".tdes"扩展名的文件中。 */private void encrypt(File fileIn, String sKey) {try {if (sKey.length() == 48) {byte[] bytK1 = getKeyByStr(sKey.substring(0, 16));byte[] bytK2 = getKeyByStr(sKey.substring(16, 32));byte[] bytK3 = getKeyByStr(sKey.substring(32, 48));FileInputStream fis = new FileInputStream(fileIn);byte[] bytIn = new byte[(int) fileIn.length()];for (int i = 0; i < fileIn.length(); i++) {bytIn[i] = (byte) fis.read();}// 加密byte[] bytOut = encryptByDES(encryptByDES(encryptByDES(bytIn, bytK1), bytK2), bytK3);String fileOut = fileIn.getPath() + ".tdes";FileOutputStream fos = new FileOutputStream(fileOut);for (int i = 0; i < bytOut.length; i++) {fos.write((int) bytOut[i]);}fos.close();JOptionPane.showMessageDialog(this, "加密成功!", "提示",JOptionPane.OK_OPTION);} elseJOptionPane.showMessageDialog(this, "密码长度必须等于48!", "错误信息",JOptionPane.ERROR_MESSAGE);} catch (Exception e) {e.printStackTrace();}}/** * 解密函数 输入: 要解密的文件,密码(由0-F组成,共48个字符,表示3个8位的密码)如: * AD67EA2F3BE6E5ADD368DFE03120B5DF92A8FD8FEC2F0746 其中: AD67EA2F3BE6E5AD * DES密码一 D368DFE03120B5DF DES密码二 92A8FD8FEC2F0746 DES密码三 输出: * 对输入的文件解密后,保存到用户指定的文件中。 */private void decrypt(File fileIn, String sKey) {try {if (sKey.length() == 48) {String strPath = fileIn.getPath();if (strPath.substring(strPath.length() - 5).toLowerCase().equals(".tdes"))strPath = strPath.substring(0, strPath.length() - 5);else {JOptionPane.showMessageDialog(this, "不是合法的加密文件!", "提示",JOptionPane.OK_OPTION);return;}JFileChooser chooser = new JFileChooser();chooser.setCurrentDirectory(new File("."));chooser.setSelectedFile(new File(strPath));// 用户指定要保存的文件int ret = chooser.showSaveDialog(this);if (ret == JFileChooser.APPROVE_OPTION) {byte[] bytK1 = getKeyByStr(sKey.substring(0, 16));byte[] bytK2 = getKeyByStr(sKey.substring(16, 32));byte[] bytK3 = getKeyByStr(sKey.substring(32, 48));FileInputStream fis = new FileInputStream(fileIn);byte[] bytIn = new byte[(int) fileIn.length()];for (int i = 0; i < fileIn.length(); i++) {bytIn[i] = (byte) fis.read();}// 解密byte[] bytOut = decryptByDES(decryptByDES(decryptByDES(bytIn, bytK3), bytK2),bytK1);File fileOut = chooser.getSelectedFile();fileOut.createNewFile();FileOutputStream fos = new FileOutputStream(fileOut);for (int i = 0; i < bytOut.length; i++) {fos.write((int) bytOut[i]);}fos.close();JOptionPane.showMessageDialog(this, "解密成功!", "提示",JOptionPane.OK_OPTION);}} elseJOptionPane.showMessageDialog(this, "密码长度必须等于48!", "错误信息",JOptionPane.ERROR_MESSAGE);} catch (Exception e) {JOptionPane.showMessageDialog(this, "解密失败,请核对密码!", "提示",JOptionPane.OK_OPTION);}}/** * 用DES方法加密输入的字节 bytKey需为8字节长,是加密的密码 */private byte[] encryptByDES(byte[] bytP, byte[] bytKey) throws Exception {DESKeySpec desKS = new DESKeySpec(bytKey);SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");SecretKey sk = skf.generateSecret(desKS);Cipher cip = Cipher.getInstance("DES");cip.init(Cipher.ENCRYPT_MODE, sk);return cip.doFinal(bytP);}/** * 用DES方法解密输入的字节 bytKey需为8字节长,是解密的密码 */private byte[] decryptByDES(byte[] bytE, byte[] bytKey) throws Exception {DESKeySpec desKS = new DESKeySpec(bytKey);SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");SecretKey sk = skf.generateSecret(desKS);Cipher cip = Cipher.getInstance("DES");cip.init(Cipher.DECRYPT_MODE, sk);return cip.doFinal(bytE);}/** * 输入密码的字符形式,返回字节数组形式。 如输入字符串:AD67EA2F3BE6E5AD 返回字节数组:{ * 173,103,234,47,59,230,229,173 } */private byte[] getKeyByStr(String str) {byte[] bRet = new byte[str.length() / 2];for (int i = 0; i < str.length() / 2; i++) {Integer itg = new Integer(16 * getChrInt(str.charAt(2 * i))+ getChrInt(str.charAt(2 * i + 1)));bRet[i] = itg.byteValue();}return bRet;}/** * 计算一个16进制字符的10进制值 输入:0-F */private int getChrInt(char chr) {int iRet = 0;if (chr == "0".charAt(0))iRet = 0;if (chr == "1".charAt(0))iRet = 1;if (chr == "2".charAt(0))iRet = 2;if (chr == "3".charAt(0))iRet = 3;if (chr == "4".charAt(0))iRet = 4;if (chr == "5".charAt(0))iRet = 5;if (chr == "6".charAt(0))iRet = 6;if (chr == "7".charAt(0))iRet = 7;if (chr == "8".charAt(0))iRet = 8;if (chr == "9".charAt(0))iRet = 9;if (chr == "A".charAt(0))iRet = 10;if (chr == "B".charAt(0))iRet = 11;if (chr == "C".charAt(0))iRet = 12;if (chr == "D".charAt(0))iRet = 13;if (chr == "E".charAt(0))iRet = 14;if (chr == "F".charAt(0))iRet = 15;return iRet;}}/** * 文件选择组件。 */class FilePanel extends JPanel {FilePanel(String str) {JLabel label = new JLabel(str);JTextField fileText = new JTextField(35);JButton chooseButton = new JButton("浏览...");this.add(label);this.add(fileText);this.add(chooseButton);clickAction ca = new clickAction(this);chooseButton.addActionListener(ca);}public String getFileName() {JTextField jtf = (JTextField) this.getComponent(1);return jtf.getText();}private class clickAction implements ActionListener {clickAction(Component c) {cmpt = c;}public void actionPerformed(ActionEvent event) {JFileChooser chooser = new JFileChooser();chooser.setCurrentDirectory(new File("."));int ret = chooser.showOpenDialog(cmpt);if (ret == JFileChooser.APPROVE_OPTION) {JPanel jp = (JPanel) cmpt;JTextField jtf = (JTextField) jp.getComponent(1);jtf.setText(chooser.getSelectedFile().getPath());}}private Component cmpt;}}/** * 密码生成组件。 */class KeyPanel extends JPanel {KeyPanel(String str) {JLabel label = new JLabel(str);JTextField fileText = new JTextField(35);JButton chooseButton = new JButton("随机产生");this.add(label);this.add(fileText);this.add(chooseButton);clickAction ca = new clickAction(this);chooseButton.addActionListener(ca);}// 返回生成的密码(48个字符长度)public String getKey() {JTextField jtf = (JTextField) this.getComponent(1);return jtf.getText();}private class clickAction implements ActionListener {clickAction(Component c) {cmpt = c;}public void actionPerformed(ActionEvent event) {try {KeyGenerator kg = KeyGenerator.getInstance("DES");kg.init(56);Key ke = kg.generateKey();byte[] bytK1 = ke.getEncoded();ke = kg.generateKey();byte[] bytK2 = ke.getEncoded();ke = kg.generateKey();byte[] bytK3 = ke.getEncoded();JPanel jp = (JPanel) cmpt;JTextField jtf = (JTextField) jp.getComponent(1);jtf.setText(getByteStr(bytK1) + getByteStr(bytK2)+ getByteStr(bytK3));} catch (Exception e) {e.printStackTrace();}}private String getByteStr(byte[] byt) {String strRet = "";for (int i = 0; i < byt.length; i++) {// System.out.println(byt[i]);strRet += getHexValue((byt[i] & 240) / 16);strRet += getHexValue(byt[i] & 15);}return strRet;}private String getHexValue(int s) {String sRet = null;switch (s) {case 0:sRet = "0";break;case 1:sRet = "1";break;case 2:sRet = "2";break;case 3:sRet = "3";break;case 4:sRet = "4";break;case 5:sRet = "5";break;case 6:sRet = "6";break;case 7:sRet = "7";break;case 8:sRet = "8";break;case 9:sRet = "9";break;case 10:sRet = "A";break;case 11:sRet = "B";break;case 12:sRet = "C";break;case 13:sRet = "D";break;case 14:sRet = "E";break;case 15:sRet = "F";}return sRet;}private Component cmpt;}}

原创粉丝点击