JAVA实现三重DES加密软件
2015-12-13 11:22
645 查看
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); }//此方法根据输入的密文字节和密钥进行解密运算,并返回明文字节 }
“`
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统