• java文本文件加密解密类


    原文:http://www.open-open.com/code/view/1420031154765

    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() );
                    else
                        JOptionPane.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() );
                    else
                        JOptionPane.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 );
                }
                else
                    JOptionPane.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 );
                    }
                }
                else
                    JOptionPane.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;
        }
    }
  • 相关阅读:
    POJ 2349 Arctic Network
    OpenJudge 东方14ACM小组 / 20170123 06:Challenge 3
    OpenJudge 东方14ACM小组 / 20170123 02 岛屿
    Best Coder Lotus and Characters
    洛谷 P 1164 小A点菜
    楼房
    虫食算
    斗地主
    国王游戏
    最优贸易
  • 原文地址:https://www.cnblogs.com/shihaiming/p/7279046.html
Copyright © 2020-2023  润新知