zoukankan      html  css  js  c++  java
  • Java实现三重DES加密算法

    信息安全原理课,本以为会学刺激的攻防,各种注入渗透,然而事实上学的是加密解密。下面代码是抄书的一个实验。
    本着学习DES算法的心态我手敲了一遍,然而完全就是写界面,核心算法用的是包里的。。
    anyway,既然代码已经敲出来了就贴一下吧,java 写的一个桌面版程序,虽然丑了点,但也不是太难写。

    代码很冗余,写这段代码的人程序能力肯定不行,但是我也没去改啦:

    import java.awt.*;
    
    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.DESKeySpec;
    import javax.crypto.spec.DESedeKeySpec;
    import javax.swing.*;
    import java.awt.event.*;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    
    
    public class FileEncrypter extends JFrame{
        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(){
                //浏览按钮的点击事件监听
                @Override
                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(){
                //以下编写"加密"按钮的监听和事件
                @Override
                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);
                                //读取明文并存入字节型数组plain中
                                byte[] plain = bytefromfile(file);
    
                                try {
                                    byte[] bytOut = encryptByDES(encryptByDES(encryptByDES(plain,key1),key2),key3);
                                    String fileOut = wenjian + ".tdes";
                                    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) {
                                    //e.printStackTrace();
                                    JOptionPane.showMessageDialog(null,"加密失败!请检查文件或者秘钥","提示",JOptionPane.OK_OPTION);
                                }
    
                            }
                        }
                    }
                }
    
            });
    
    
            JButton jbD = new JButton("解密");
            c.add(jbD);
            //解密按钮点击事件
            jbD.addActionListener(new ActionListener(){
    
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    String wenjian,wenjian1,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,key3),key2),key1);
    
                                    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);
                    }
                }
    
            });
    
    
    
        }
    
    
        //从输入的文件中读取字节,保存于TextofFile数组中,并返回
        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){
                e.printStackTrace();
            }
            return 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.ENCRYPT_MODE, sk);
            return cip.doFinal(bytP);
        }
    
        //根据密文和秘钥进行解密
        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);
        }
    
    
    }
    

    运行截图:

    这里写图片描述

  • 相关阅读:
    这个Pandas函数可以自动爬取Web图表
    /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by /usr/local/python3.6/lib/python3.6/site-packages/paddle/fluid/core_avx.so)
    kubernetes yaml详解
    centos 安装kubernetes
    初识kafka-connect
    Docker1:本地连接Docker中的mysql,实现数据同步
    git分支管理规范
    cat 配置告警规则
    Java的即时编译(Just In Time, JIT)及其优化
    java自定义实现一个缓存器
  • 原文地址:https://www.cnblogs.com/yinyoupoet/p/13287519.html
Copyright © 2011-2022 走看看