java文本文件加密解密类
原文:http://www.open-open.com/code/view/1420031154765
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 Test extends JFrame
{
public static final int WIDTH = 550;
public static final int HEIGHT = 200; public static void main ( String args[] )
{
Test fe = new Test();
fe.show();
} Test()
{
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常用的加密解密类 原文转载至:http://blog.csdn.net/wyc_cs/article/details/8793198 原创 2013年04月12日 14:33:35 1704 ...
- C# 实现 JAVA AES加密解密[原创]
以下是网上普遍能收到的JAVA AES加密解密方法. 因为里面用到了KeyGenerator 和 SecureRandom,但是.NET 里面没有这2个类.无法使用安全随机数生成KEY. 我们在接收J ...
- C#与Java同步加密解密DES算法
在实际项目中,往往前端和后端使用不同的语言.比如使用C#开发客户端,使用Java开发服务器端.有时出于安全性考虑需要将字符加密传输后,由服务器解密获取.本文介绍一种采用DES算法的C#与Java同步加 ...
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
你真的了解字典(Dictionary)吗? 从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...
- 【转】 java RSA加密解密实现
[转] java RSA加密解密实现 该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar 下载地址:http://download.csdn.net/detai ...
- AES对称加密解密类
import java.io.UnsupportedEncodingException; import javax.crypto.Cipher; import javax.crypto.spec.Se ...
- [C#] 常用工具类——加密解密类
using System; using System.Configuration; using System.Collections.Generic; using System.Text; using ...
- 对接携程供应商php加密解密类
php加密解密类 <?php class Aes{ private $key = '6b4d63211b4ba869'; private $iv = 'dbbf079b95004f65'; pu ...
- PHP针对数字的加密解密类,可直接使用
<?phpnamespace app;/** * 加密解密类 * 该算法仅支持加密数字.比较适用于数据库中id字段的加密解密,以及根据数字显示url的加密. * @author 深秋的竹子 * ...
随机推荐
- 四:SQL语句介绍
前言:介绍SQL语句及其大致的分类 一:SQL语句介绍(Structured SQL Lanage) 结构化的查询语言 是一种特殊的编程语言 是一种数据库查询和程序设计语言 用于存取数据及查询.更新和 ...
- lnmp一键安装包 虚拟主机问题
lnmp一键安装包淌过的坑 --手动虚拟主机配置 安装一键包的时候教程 官网也有虚拟主机的教程 一下示例: 后来自己手动去做 就遇到了一个大家都遇到的问题 及时安装让nginx支持解析PHP脚本解析 ...
- webpack-dev-server proxy代理
一个最简单的代理例子:index.html中有如下代码 fetch('/api/pub/article/list?pageSize=2').then((data)=>{ return data. ...
- Springboot(二)-application.yml默认的配置项以及读取自定义配置
写在前面 ===== spring-boot 版本:2.0.0.RELEASE ===== 读取自定义配置 1.配置文件:sys.properties supply.place=云南 supply.c ...
- Python9-模块2-包的进阶-day21
包是一种通过使用‘.模块名’来组织python模块名称空间的方式. 1. 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉: ...
- JQuery中点击超链接动态修改url连接地址无效
这篇随笔的标题真是好拗口,想表达的意思是,当点击超链接后,才去修改超链接的地址,此时超链接仍然链接的是是修改之前的页面,而不是修改之后的页面. 超链接代码如下: <a id="chao ...
- 【MySQL】可重复读模式下 unique key失效案例
一 [背景] 今天上午文能提笔安天下,武能上马定乾坤的登博给团队出了一道题目,谁先复现问题,奖励星巴克一杯.激起了一群忙碌的屌丝DBA的极大热情.问题是这样滴,如下图登博提示了几个细节: 1. ...
- [转]构建Python+Selenium2自动化测试环境(一)
很久没有了解自动化了,最近发现项目中沉淀了很多东西,回归测试效 率很低,所以必须要考虑构建自动化来提供各个环节的小效率.由于忙于需求以及产品的流程规范,现在对于测试技术方面的研究也相对少了很多.不过不 ...
- Leetcode 335.路径交叉
路径交叉 给定一个含有 n 个正数的数组 x.从点 (0,0) 开始,先向北移动 x[0] 米,然后向西移动 x[1] 米,向南移动 x[2] 米,向东移动 x[3] 米,持续移动.也就是说,每次移动 ...
- PL/SQL配置访问多个不同IP的oracle
第一步:打开Oracle的tnsnames.ora文件.添加 test = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = ...