您的位置:首页 > 编程语言 > Java开发

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 加密