JAVA实现三重DES加密软件

DES是一个16轮的Feistel型结构密码,它的分组长度为64比特,用一个56比特的密钥来加密一个64比特的明文串,输出一个64比特的密文串。其中,使用密钥为64比特,实用56比特,另8位用作奇偶校验。加密的过程是先对64位明文分组进行初始置换,然后分左、右两部分分别经过16轮迭代,然后再进行循环移位与变换,最后进行逆变换得出密文。加密与解密使用相同的密钥,因而它属于对称密码体制。
三重DES加密算法安全性较高,该软件仅仅能加密8字节倍数长度的文件,后续将会持续开发。
效果图如下:

这里写图片描述
`

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.lang.*;
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;

@SuppressWarnings("serial")
public class FileEncrypter extends JFrame {

    @SuppressWarnings("deprecation")
    public static void main(String args[])
    {
        FileEncrypter fe=new FileEncrypter();
        fe.show();   
    }

     FileEncrypter()
    {
        this.setSize(550,200);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocation(400,300);
        this.setTitle("文件加密工具(3DES)");
        Container c =this.getContentPane();
        c.setLayout(new FlowLayout());
        JLabel label=new JLabel("文件选择");
        c.add(label);
        final JTextField fileText=new JTextField(35);
        c.add(fileText);
        JButton chooseButton=new JButton("浏览......");
        chooseButton.addActionListener(new ActionListener()//以下编写浏览时间的监听和事件
        {
            public void actionPerformed(ActionEvent e)
            {
                JFileChooser chooser=new JFileChooser();
                chooser.setCurrentDirectory(new File("."));
                int result=chooser.showOpenDialog(null);
                if(result==JFileChooser.APPROVE_OPTION)//获得选择文件的绝对路径
                {
                    String path=chooser.getSelectedFile().getAbsolutePath();
                    fileText.setText(path); 
                }
            }   
        });
        c.add(chooseButton);
        JLabel label2=new JLabel("密钥(24个字符):");
        c.add(label2);
        final JTextField keyText=new JTextField(35);
        c.add(keyText);
        JButton jbE=new JButton("加密");
        c.add(jbE);
        jbE.addActionListener(new ActionListener()  //以下编写加密的监控和事件
            {
                public void actionPerformed(ActionEvent event)
                {
                    String wenjian,miyao;
                    wenjian=fileText.getText();
                    miyao=keyText.getText();
                    if("".equals(wenjian)||wenjian==null)
                        JOptionPane.showMessageDialog(null, "请选择文件!","提示",JOptionPane.OK_OPTION);
                    else
                        if("".equals(miyao)||miyao==null)
                            JOptionPane.showMessageDialog(null, "请输入24字符密钥!","提示",JOptionPane.OK_OPTION);
                        else
                        {
                            if(miyao.length()!=24)
                            {
                                JOptionPane.showMessageDialog(null, "密钥必须为24字符!","提示",JOptionPane.OK_OPTION);
                            }
                            else
                            {
                                byte[] key1=miyao.substring(0, 8).getBytes();
                                byte[] key2=miyao.substring(8,16).getBytes();
                                byte[] key3=miyao.substring(16,24).getBytes();    //将三个密钥分别存入字节型数组中
                                File file=new File(wenjian);
                                byte[] plain=bytefromfile(file);
                                //读取明文并存入字节型数组plain中,bytefromfile()方法定义在后
                                try
                                {
                                    byte[] bytOut=encryptByDES(encryptByDES(encryptByDES(plain,key1),key2),key3);
                                            //实施加密,加密后的密文字节存储在bytOut中encryptByDES()方法定义在后
                                String fileOut=wenjian+".tdes";
                                FileOutputStream fos=new FileOutputStream(fileOut);
                                for(int i=0;i<bytOut.length;i++)
                                {
                                    fos.write((int)bytOut[i]);
                                }
                                fos.close();//将bytOut数组的内容写入新文件
                                JOptionPane.showMessageDialog(null, "加密成功!","提示",JOptionPane.INFORMATION_MESSAGE);
                                }

                                catch(Exception e)
                                {
                                    JOptionPane.showMessageDialog(null, "加密失败!请检查文件或密钥!","提示",JOptionPane.OK_OPTION);
                                }
                            }
                        }
                }
            });//编写加密事件完毕

        JButton jbD=new JButton("解密");
        c.add(jbD);
        jbD.addActionListener(new ActionListener()
            {//编写解密的监控及事件
                public void actionPerformed(ActionEvent event)
                {
                    String wenjian,miyao;
                    wenjian=fileText.getText();
                    miyao=keyText.getText();
                    if("".equals(wenjian)||wenjian==null)
                        JOptionPane.showMessageDialog(null, "请选择文件!","提示",JOptionPane.OK_OPTION);return;
                    if(wenjian.substring(wenjian.length()-5).toLowerCase().equals(".tdes"))
                            if(miyao.length()!=24)
                            {
                                JOptionPane.showMessageDialog(null, "密钥必须为24字符!","提示",JOptionPane.OK_OPTION);return;
                            }
                            else
                            {
                                wenjian1=wenjian.substring(0, wenjian.length()-5);
                                JFileChooser chooser=new JFileChooser();
                                chooser.setCurrentDirectory(new File("."));
                                chooser.setSelectedFile(new File(wenjian1));
                                //用户指定保存的文件
                                int ret=chooser.showSaveDialog(null);
                                if(ret==0)
                                {
                                    byte[] key1=miyao.substring(0, 8).getBytes();
                                    byte[] key2=miyao.substring(8,16).getBytes();
                                    byte[] key3=miyao.substring(16,24).getBytes(); //读取解密密钥
                                    File file=new File(wenjian);
                                    byte[] miwen=bytefromfile(file);//读取密文

                                    try
                                    {
                                        byte[] bytOut=decryptByDES(decryptByDES(decryptByDES(miwen,key1),key2),key3);//解密,机密后的密文存储在bytOut中,decryptByDES()方法在后面
                                        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(null, "解密完成!","提示",JOptionPane.INFORMATION_MESSAGE);
                                    }

                                    catch(Exception e)
                                    {
                                        JOptionPane.showMessageDialog(null, "解密失败!请检查密钥或文件!","提示",JOptionPane.OK_OPTION);
                                    }
                                }
                            }
                    else
                    {
                        JOptionPane.showMessageDialog(null, "不是合法的加密文件!","提示",JOptionPane.OK_OPTION);
                        return;
                    }
                }
            });//解密完毕
    }
        private byte[] bytefromfile(File filein)
        {
            byte[] TextofFile=new byte[(int)filein.length()];
            try
            {
                FileInputStream fin=new FileInputStream(filein);
                for(int i=0;i<filein.length();i++)
                {
                    TextofFile[i]=(byte)fin.read();
                }
                fin.close();
            }

            catch(IOException e)
            {
                System.err.println(e);
            }
            return TextofFile;
        }//此方法从输入文件中逐字节读取,存储在TextofFile数组中并返回此数组的值

        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.DECRYPT_MODE,sk);
            return cip.doFinal(bytP);
        }//此方法根据输入的明文字节和密钥字节进行加密运算,并返回密文字节

        @SuppressWarnings("unused")
        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);
        }//此方法根据输入的密文字节和密钥进行解密运算,并返回明文字节

}






“`

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值