举个例子:

import java.awt.*;
import java.awt.event.*;import java.io.*;import java.security.*;import javax.crypto.*;
import javax.crypto.spec.*;import javax.swing.*;/**
文件名: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;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);}}});}public static void main(String[] args) {FileEncrypter fe = new FileEncrypter();fe.show();}/**加密函数输入:要加密的文件,密码(由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 {private Component cmpt;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());}}}
}/**
密码生成组件。
*/
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 {private Component cmpt;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;}}
}

MD5文件加密和解密相关推荐

  1. tkinter实现文件加密和解密

    源代码:https://gitee.com/mydreamambitious/file-encryption-and-decryption 注:这个代码和界面是做好的,但是还在进行优化和美化中.但是在 ...

  2. Java基础篇之利用IO流给文件加密、解密

    目标:给文件加密.解密(最基础版) 注意: a.加密过程:先读取整个目标文件,然后将目标文件写入一个新的文件中,在写入的过程中,每隔几个字符插入一个加密符号(随意定),此时这个新的文件就是加密文件 b ...

  3. (C语言)简单的文件加密和解密程序

    一个简单的文件加密和解密程序 main.c #include <stdio.h> #include <stdlib.h> #include "fun.h"i ...

  4. php 结合md5的加密,解密方法

    php 结合md5的加密,解密方法 张映 发表于 2012-06-28 分类目录: php 标签:md5, php 最近在整理代码发现了一个不错的东西,结合md5的加解密算法.网上关于php结合md5 ...

  5. 文件加密和解密 - 密钥存储

    当我们想要做一次加密系统,或者只是有一个关于这个问题,它是如何保存的加密和解密密钥. 一般认为想要的文件加密和解密,对称算法用于.一般是AES要么DES. 这就存在密钥管理的问题,它是如何? 基本上两 ...

  6. Linux下使用Vim/Vi给文件加密和解密

    本文介绍在Linux下使用Vim/Vi给文件加密和解密的简单方法,Vim的文件加密功能不是很强,但比较实用,因为不必要借助其他软件即可实现. 一. 用 Vim/Vi 加密文件: 用 Vim/Vi 加密 ...

  7. php 加盐md5,php 结合md5的加密,解密方法

    最近在整理代码发现了一个不错的东西,结合md5的加解密算法.网上关于php结合md5的加密,解密算法比较少的,其实php手册里面就有,改一改就行了.在此贴一下,用这算法要加载一个php模块mcrypt ...

  8. 文件加密和解密软件:AutoCrypt for mac

    为大家推荐一款好用的文件加密和解密软件,AutoCrypt for mac具备强大的AES-256算法,只需点击一下,即可加密并保存在自定义位置,能够轻松帮助用户加密或解密文件,而且autocrypt ...

  9. xml文件加密和解密

    XML介绍 Extensible Markup Language(XML),可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言. XML文件特征如下: a) XML第一行是声明, 格式如下 ...

最新文章

  1. 深挖数据价值 阿里云栖开年大会报道
  2. 把PPT做漂亮点真的有用!图表美观能增加可信度!作者:还会影响论文引用和通过率...
  3. 138 条 Vim 命令、操作、快捷键全集
  4. 三维重建:PNG格式详解-与LibPNG使用
  5. 如何使用sdkmanager命令行接受SDK package的license
  6. 关于当一个C#工程移植到另一台机子上(win7)上时,程序报错。dll没有被指定在Windows上运行,或者它包含错误。请尝试使用原始安装媒体重新安装程序。。。。。。...
  7. 吃透web前端秘籍,来听听大佬是怎么说的
  8. Swift 3: let sortedNumbers = numbers.sort { $0 $1 } print(sortedNumbers) 结果显示为()
  9. 毕设题目:Matlab图像配准
  10. 相见恨晚的 18 个 Linux 趣味命令,最后一个千万要尝试~
  11. 使用STM8S003F3P6的硬件I2C读写AT24C16的EEPROM的经验心得
  12. python自动排版公众号_GitHub - qfwc258/maxpress: MaxPress:MarkDown+Python实现微信公众号一键排版...
  13. linux最好的mp4软件,【良心推荐】5款好用的MP4视频编辑器
  14. 75.(leaflet之家)leaflet柱状图
  15. c语言模拟交通信号,C语言编写的交通信号灯
  16. 关于交换机包转发1.488Mpps是如何计算出来?
  17. mac重置系统_如何在Mac上重置打印系统
  18. Xshell、Xftp软件评估过期解决方案
  19. Python实现的一个简洁轻快的后台管理框架.支持拥有多用户组的RBAC管理后台,不用配置各种运行环境
  20. python音频特征提取_Python干货:如何使用Python对音频进行特征提取?

热门文章

  1. C++:实现量化CPI债券交换测试实例
  2. 文件上传绕过安全狗WAF实战
  3. 经管保研|2022复旦经院推免研究报告
  4. matlab roundn函数_matlab中round函数具体用法
  5. linux git rabit,Linux 安装 RabbitMQ
  6. 嵌入式作业STM32F103C8T6和stm32CubeMX实现LED灯
  7. hive表加载csv格式数据或者json格式数据
  8. Winows笔记本设置合上盖子不休眠
  9. ubuntu 18.04-设置合上笔记本盖子不休眠
  10. java-No route to host 解决办法