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());elseJOptionPane.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());elseJOptionPane.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);} elseJOptionPane.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);}} elseJOptionPane.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 文本文件加密 文本文件解密相关推荐

  1. Java课程设计——文本文件加密与解密软件设计与实现

    源文件链接: Java文本文件加密与解密-其它文档类资源-CSDN文库 摘要 随着现代网络技术的飞速发展,人们的个人信息.文件传递以及电子商务等方面都需要大力的保护,文件加密技术也应运而生.本次使用J ...

  2. 文本文件加密和解密_解密文本见解和相关业务用例

    文本文件加密和解密 The objective is to provide crisp information about possibilities in Text analytics and ho ...

  3. JAVA各种加密与解密方式

    之前有兴趣研究了一下java的加密与解密的方法,发现市面上有好多种加密解密方式,在这里整理了一下. 目录 1.BASE64加密/解密 2.MD5(Message Digest Algorithm)加密 ...

  4. Java cipher加密与解密

    javax.crypto.Cipher类提供加密和解密功能,该类是JCE框架的核心. ENCRYPT_MODE,加密数据 DECRYPT_MODE,解密数据 WRAP_MODE,将一个Key封装成字节 ...

  5. java dsa加密与解密_Java DSA 加密 | 解密

    Java DSA 加密 | 解密 什么是DSA ? DSA (Digital Signature Algorithm) 是 Schnorr 和 ElGamal 签名算法的变种,被美国 NIST 作为 ...

  6. Java各种加密和解密方式

    加密算法 文章1:https://www.cnblogs.com/xibushijie/p/12851771.html 文章2:https://blog.csdn.net/weixin_3706959 ...

  7. java 密码解密_【java密码加密与解密】

    以下两个类可以很方便的完成字符串的加密和解密: 加密:CryptHelper.encrypt(password) 解密:CrypHelper.decrypt(password) 代码如下: Crypt ...

  8. java base64加密与解密

    目录 前言 一.base64加密与解密 1. base64有填充的编码与解码 2. base64无填充的编码与解码 二.MIME友好型base64加密与解密 前言 Base64 编码会将字符串编码得到 ...

  9. java word 加密_如何通过Java实现加密、解密Word文档

    前言 对一些重要文档,我们为保证其文档内容不被泄露,常需要对文件进行加密,查看文件时,需要正确输入密码才能打开文件.下面介绍了一种比较简单的方法给Word文件加密以及如何给已加密的Word文件解除密码 ...

最新文章

  1. 模板网站建设过程中需要注意哪些细节问题?
  2. 金融风控实战——Hive详解(数据读取、预处理、特征工程)
  3. Maven项目不能编译jsp解决方法:Unable to compile class for JSP
  4. jsp oracle 环境配置文件,jsp + tomcat 连接Oracle数据实例
  5. 多伦多计算机科学大学,加拿大计算机科学专业 - 加拿大多伦多大学的计算机专业...
  6. 美团算法专家:入门机器学习,比你想的要简单
  7. Quartz.net基于数据库的任务调度管理(Only.Jobs)
  8. python批量复制粘贴_用python批量复制特定图片
  9. Linux学习总结(2)——linux常用命令大全
  10. bagging算法_集成学习(Ensemble Learning)——Bagging与Random Forest(1)
  11. 【水果识别】基于matlab GUI自助水果超市【含Matlab源码 594期】
  12. 【转】脉络清晰的BP神经网络讲解,赞
  13. 4符号代码_身为程序员我敢跟你打赌100块,这个数学符号你根本不会认不会写...
  14. oracle设置自增字段,oracle序列
  15. python 断言详细讲解用法及其案例_Python断言的最佳实践
  16. mathtype删除注册表的方法
  17. 一首光辉岁月的歌词,送给自己
  18. 计算机语言学习书籍目录资源自己找(到处复制粘贴的目录)
  19. 专访|十年程序员董一凡:生命不息,学习不止
  20. 《编译原理-龙书》练习第3章

热门文章

  1. 【教程】jadx反编译工具的安装
  2. 开发质量问题复盘总结-pua性质的标题
  3. 微信小程序怎么添加到主屏幕将微信小程序放到手机桌面?
  4. 病毒防治:清除***从它的寄生地开始
  5. PS制作心跳二维码动画 学会后能增加粉丝关注率哦
  6. 软考真题的重要性不用再强调了吧
  7. 计算机技术对艺术的影响,数字化技术对当代艺术发展的影响--理论
  8. 26设计模式之建造者模式
  9. 关于旷世科技的融资,比金额更关键的是投资方是谁
  10. wince之WiFi漫游的工作原理