欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

java文本文件加密解密类,java加密解密,import java.

来源: javaer 分享于  点击 38628 次 点评:63

java文本文件加密解密类,java加密解密,import java.


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] &amp; 240 ) / 16 );                strRet += getHexValue ( byt[i] &amp; 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;    }}
相关栏目:

用户点评