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 FileEncrypter extends JFrame{ public static final int WIDTH = 550; public static final int HEIGHT = 200; public static void main(String args[]) { FileEncrypter fe = new FileEncrypter(); fe.show(); }
FileEncrypter(){
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]&240)/16);
strRet += getHexValue(byt[i]&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;
}
}
分享到:
相关推荐
Java文件加密器是一款基于Java开发的实用工具,用于保护个人或组织的数据安全。这款软件的主要功能是对文件进行加密,防止未经授权的访问。由于是作为编程练习而创建的,它的加密算法可能相对较简单,但仍然能够提供...
Java加密器Applet小程序是一种基于Java编程语言的小型应用程序,它可以在Web浏览器环境中运行,用于对文件进行加密处理。Applet是Java平台早期的一种特性,允许开发者创建可以在客户端计算机上执行的互动内容,通常...
本项目"Java写的文件加密器"是一个利用Java实现的工具,它能够对整个目录进行加密,从而保护其中的数据不被未经授权的访问。这个项目对于初学者来说是一个很好的学习资源,因为它涵盖了Java中的基础文件操作、加密...
在本例中,"TXT文本加密器"可能作为一个单独的Java应用程序被打包成RAR文件,以便用户下载和安装。 总的来说,Java编写的文本加密器结合了密码学理论和Java编程技术,为用户提供了一种安全的手段来保护其文本信息不...
Java 文件夹加密工具是一种基于Java编程语言开发的实用程序,主要功能是对用户的文件或文件夹进行加密,以保护数据的安全性。由于它被打包成了exe可执行文件,这意味着非Java环境的用户也能直接运行,无需安装Java...
用java 编写的一个DES加密文本文档的小程序 希望对大家有用 含有源代码
- **加密算法调用**:使用`Cipher`类实例化加密器,指定加密算法为TriDes,并设置加密模式。然后分别使用三个子密钥对文件内容进行加密。 - **保存加密结果**:加密完成后,将加密后的字节流写入一个新的文件中,...
【Java文件加密器】是一个基于Java编程语言实现的文件安全工具,主要目的是为用户提供一种简单易用的方式来保护他们的数据安全。这份"毕业设计报告"详细记录了开发过程、设计思路和实现方法,对于初学者来说,是深入...
this.setTitle("文件加密器(TirDES)"); Container c = this.getContentPane(); c.setLayout(new FlowLayout()); final FilePanel fp = new FilePanel("文件选择"); c.add(fp); // ... 其他模块的添加 ... ...
【源程序】部分,即des-java源程序,通常包含.java文件,这些文件包含了加密器的算法实现和功能逻辑。开发者或者有技术背景的用户可以通过查看和修改源代码来了解加密过程,或者根据需求进行定制。 基于JAVA的IDS...
在这个场景下,Java程序作为加密器,使用可能包括替换、位操作、混淆等方法将JS代码转换为非可读格式。加密后的代码无法直接运行,需要通过相应的解密机制才能恢复其原有的功能。 JS代码加密通常分为两个主要步骤:...
### Java加密解密小程序知识点详解 #### 一、程序概述 本程序是一个基于Java Swing的图形用户界面(GUI)加密解密工具。它允许用户在窗口中输入明文信息,并通过点击“加密”按钮实现对信息的加密处理;加密后的...
- **其他定义**:定义密钥生成器、加密器、解密器等类。 ##### 2.2 主程序的流程 1. 用户选择需要加密的文件。 2. 生成密钥。 3. 加密文件。 4. 解密文件。 ##### 2.3 各程序模块之间的层次(调用)关系 - **模块...
本项目名为“基于Java的简单的文件加密器”,其目标是创建一个程序,能够对用户指定的文件进行加密,确保数据的安全性。 【描述】: “基于Java的简单的文件加密器” 这个项目可能使用了Java的基本IO流和加密库,如...
ET199加密狗内部可能包含了微处理器、闪存存储和加密算法,能够执行复杂的计算并存储机密数据。 在Java中与ET199加密狗进行交互通常需要使用特定的API库,这个库可能由加密狗的制造商提供,例如Aladdin、HID Global...
Java加密解密工具包,通常用于保护敏感数据的安全,防止未经授权的访问或篡改。这个名为"JCT"的工具包提供了丰富的功能,使得开发者在Java应用中集成加密和解密操作变得更加简单。下面我们将详细探讨Java加密的相关...
本项目是一个基于Java实现的文件加密器,旨在帮助用户保护他们的数据免受未经授权的访问。下面将详细介绍这个项目涉及的关键知识点。 首先,我们要了解的是“文件加密”。文件加密是一种通过应用特定算法将明文数据...
从给定的文件信息来看,虽然标题和描述都是“java文字加密实例”,但实际上代码示例并未涉及具体的加密算法或过程。然而,我们可以基于这个主题,深入探讨Java中的文本加密技术,包括其背景、原理以及常见加密算法的...
在代码加密的场景下,jvmti可以用来在程序运行时解密并加载加密过的类,以此来防止源码被反编译。 代码加密的基本流程如下: 1. **预处理阶段**:对原始的Java源码或编译后的字节码进行加密,通常使用对称加密算法...
在加密场景下,我们可以利用自定义类加载器来动态地解密存储在加密格式中的类文件。例如,我们可以将敏感的类或库在磁盘上以加密形式存储,然后在运行时由专门的类加载器解密并加载到JVM中。这样做可以增强应用程序...