程序 人生

          程序 人生

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            11 Posts :: 2 Stories :: 18 Comments :: 0 Trackbacks
          import java.awt.*;
          import java.awt.event.*;
          import javax.swing.*;
          import java.io.*;
          import java.security.*;
          import javax.crypto.*;
          /*
          ?* FileEncrypterT.java
          ?*
          ?* Created on 2006年6月29日, 上午11:14
          ?*/
          package key;
          import java.awt.*;
          import java.awt.event.*;
          import javax.swing.*;
          import java.io.*;
          import java.security.*;
          import javax.crypto.*;
          import javax.crypto.spec.*;
          /**
          ?*
          ?* @author? dragon love
          ?*/
          public class FileEncrypterT extends javax.swing.JFrame {
          ??? public static final int WIDTH = 550;
          ??? public static final int HEIGHT = 200;
          ???
          ??? /** This method is called from within the constructor to
          ???? * initialize the form.
          ???? * WARNING: Do NOT modify this code. The content of this method is
          ???? * always regenerated by the Form Editor.
          ???? */
          ??? // <editor-fold defaultstate="collapsed" desc=" Generated Code ">?????????????????????????
          ??? private void initComponents() {
          ???????
          ??????? setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
          ??????? org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
          ??????? getContentPane().setLayout(layout);
          ??????? layout.setHorizontalGroup(
          ??????????????? layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
          ??????????????? .add(0, 400, Short.MAX_VALUE)
          ??????????????? );
          ??????? layout.setVerticalGroup(
          ??????????????? layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
          ??????????????? .add(0, 300, Short.MAX_VALUE)
          ??????????????? );
          ??????? pack();
          ??? }
          ??? // </editor-fold>???????????????????????
          ???
          ??? /**
          ???? * @param args the command line arguments
          ???? */
          ??? public static void main(String args[]) {
          ??????? FileEncrypter fe = new FileEncrypter();
          ??????? fe.show();
          ??? }
          ??? FileEncrypterT(){
          ??????? 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());
          ??????????????? else
          ??????????????????? JOptionPane.showMessageDialog(
          ??????????????????????????? null,"請(qǐng)選擇文件!","提示",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());
          ??????????????? else
          ??????????????????? JOptionPane.showMessageDialog(
          ??????????????????????????? null,"請(qǐng)選擇文件!","提示",JOptionPane.OK_OPTION);
          ??????????? }
          ??????? });
          ??? }
          ???
          ??? /**
          ???? * 加密函數(shù)
          ???? * 輸入:
          ???? * 要加密的文件,密碼(由0-F組成,共48個(gè)字符,表示3個(gè)8位的密碼)如:
          ???? * AD67EA2F3BE6E5ADD368DFE03120B5DF92A8FD8FEC2F0746
          ???? * 其中:
          ???? * AD67EA2F3BE6E5AD DES密碼一
          ???? * D368DFE03120B5DF DES密碼二
          ???? * 92A8FD8FEC2F0746 DES密碼三
          ???? * 輸出:
          ???? * 對(duì)輸入的文件加密后,保存到同一文件夾下增加了".tdes"擴(kuò)展名的文件中。
          ???? */
          ??? 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);
          ??????????? }else
          ??????????????? JOptionPane.showMessageDialog(
          ??????????????????????? this,"密碼長度必須等于48!","錯(cuò)誤信息",JOptionPane.ERROR_MESSAGE);
          ??????? }catch(Exception e){
          ??????????? e.printStackTrace();
          ??????? }
          ??? }
          ???
          ??? /**
          ???? * 解密函數(shù)
          ???? * 輸入:
          ???? * 要解密的文件,密碼(由0-F組成,共48個(gè)字符,表示3個(gè)8位的密碼)如:
          ???? * AD67EA2F3BE6E5ADD368DFE03120B5DF92A8FD8FEC2F0746
          ???? * 其中:
          ???? * AD67EA2F3BE6E5AD DES密碼一
          ???? * D368DFE03120B5DF DES密碼二
          ???? * 92A8FD8FEC2F0746 DES密碼三
          ???? * 輸出:
          ???? * 對(duì)輸入的文件解密后,保存到用戶指定的文件中。
          ???? */
          ??? 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);
          ??????????????? }
          ??????????? }else
          ??????????????? JOptionPane.showMessageDialog(
          ??????????????????????? this,"密碼長度必須等于48!","錯(cuò)誤信息",JOptionPane.ERROR_MESSAGE);
          ??????? }catch(Exception e){
          ??????????? JOptionPane.showMessageDialog(
          ??????????????????? this,"解密失敗,請(qǐng)核對(duì)密碼!","提示",JOptionPane.OK_OPTION);
          ??????? }
          ??? }
          ???
          ??? /**
          ???? * 用DES方法加密輸入的字節(jié)
          ???? * bytKey需為8字節(jié)長,是加密的密碼
          ???? */
          ??? 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方法解密輸入的字節(jié)
          ???? * bytKey需為8字節(jié)長,是解密的密碼
          ???? */
          ??? 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);
          ??? }
          ???
          ??? /**
          ???? * 輸入密碼的字符形式,返回字節(jié)數(shù)組形式。
          ???? * 如輸入字符串:AD67EA2F3BE6E5AD
          ???? * 返回字節(jié)數(shù)組:{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;
          ??? }
          ??? /**
          ???? * 計(jì)算一個(gè)16進(jìn)制字符的10進(jìn)制值
          ???? * 輸入: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;
          ??? }
          ??? // Variables declaration - do not modify????????????????????
          ??? // End of variables declaration??????????????????
          ???
          }
          /**
          ?* 文件選擇組件。
          ?*/
          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("隨機(jī)產(chǎn)生");
          ??????? this.add(label);
          ??????? this.add(fileText);
          ??????? this.add(chooseButton);
          ??????? clickAction ca = new clickAction(this);
          ??????? chooseButton.addActionListener(ca);
          ???????
          ??? }
          ???
          //返回生成的密碼(48個(gè)字符長度)
          ??? 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;
          ??? }
          }




          摘自:http://dev.csdn.net/article/article/63/63304.shtm
          posted on 2006-06-29 10:19 程序-人生 閱讀(8430) 評(píng)論(6)  編輯  收藏

          Feedback

          # re: JAVA文件加密器(收藏) 2006-06-29 13:57 david.turing
          TripleDes是
          encryptByDES(encryptByDES(
          encryptByDES(bytIn,bytK1),bytK2),bytK3); 的嗎?呵呵  回復(fù)  更多評(píng)論
            

          # re: JAVA文件加密器(收藏) 2006-06-29 14:18 dudu
          請(qǐng)?jiān)谑醉摪l(fā)表原創(chuàng)文章!  回復(fù)  更多評(píng)論
            

          # re: 有關(guān)JAVA文件加密與解密 2006-07-04 16:52 liaowufeng
          上面這個(gè)程序有問題,當(dāng)對(duì)大的文件加密時(shí),GUI會(huì)出問題。請(qǐng)注意,事處線程中不要處理加解密操作,而應(yīng)在事件線程中啟動(dòng)一個(gè)新的線程來處理。呵呵。
          可參見www.javaresearch.org中我寫的文件加解密工具。
            回復(fù)  更多評(píng)論
            

          # re: 有關(guān)JAVA文件加密與解密 2008-06-13 15:07 路過
          3M左右的東西,速度就太慢了.把我的IDE都崩了  回復(fù)  更多評(píng)論
            

          # re: 有關(guān)JAVA文件加密與解密[未登錄] 2008-12-28 12:47
          有沒運(yùn)行截圖啊  回復(fù)  更多評(píng)論
            

          # re: 有關(guān)JAVA文件加密與解密[未登錄] 2012-03-15 11:51 111
          @dudu
          112222121  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 柘城县| 平乡县| 新乐市| 广东省| 沿河| 武平县| 湾仔区| 曲麻莱县| 广平县| 浑源县| 清流县| 沁水县| 突泉县| 中西区| 铅山县| 阳新县| 徐州市| 栾城县| 北流市| 新乐市| 富民县| 友谊县| 渝北区| 山丹县| 天全县| 虎林市| 封丘县| 忻州市| 乳山市| 当雄县| 台北县| 镇沅| 曲阳县| 乌拉特后旗| 通榆县| 珠海市| 霞浦县| 泰来县| 宁安市| 墨江| 盐津县|