转载自:https://www.cnblogs.com/tgyf/p/4676878.html
  先对文件与加密的相关知识做一个极为简单的科普(知道的可以跳过)。

文件与字串

A、文件的操作流程一般为:打开–>读取–>对内容进行变换–>写入–>关闭。

B、常规性文件操作会用到的类有五个:File,InputStream,OutputStream,FileInoutStream,FileOutputStream,均包含在java.io下面。注意,在使用前必须对类文件进行导入,方法为import java.io.File(实现时需要分号结尾)。

C、创建InputStream类和OutputStream类的对象时,new关键字后边的类分别是FileInputStream和FileOutputStream(而不是其自身),如InputStream fin = new FileInputStream(File objectFile)。可以看出构造参数是File类型对象,其创建方式为File file = new File(String fileName)。

D、当String类对象作为函数参数时,可以直接传入常量字符串,如“D:\source.jpg”。String类对象构造方法中比较简单也是最常用的一种是String string = “string content”,当然,最终执行的是String string = new String(“string content”)。其实String是非常重要的类(可以说无处不在),提供了一套完善、高效操作字串的方法,使得开发者受益匪浅。

E、常规性文件操作涉及到的方法有五个:exist(),read(),write(),flush(),close()。exist()判断文件是否存在,调用者为File类对象;read()读取输入流中的内容,调用者为InputStream类对象;write()、flush()、close()的作用分别为向输出流中写内容、强制发送缓冲区中数据、保存并关闭文件,调用者为OutputStream类对象,不过InputStream类对象在操作完成后也需要close()。

加密算法

MD5:以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

SHA:接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。

DES:把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,主要分为两步:

(1)初始置换,把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则为将输入的第58位换到第一位,第50位换到第2位…依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位。

(2)逆置换,经过16次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,逆置换正好是初始置换的逆运算,由此即得到密文输出。

3-DES:使用3条56位的密钥对数据进行三次加密,是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准)。

AES:使用128、192、和256位密钥,并且用128位分组加密和解密数据。

异或:与其说这是一种加密算法,倒不如称其为文件信息的简单变换,将每一个数据与某给定数据进行异或操作即可完成加密或解密,如dataEncrypt = dataSource^dataSecret。

OK,是时候回到文件加密与解密的具体实现这个主题上来了。后续的举例均采用图片(包括GIF动画)类型,而其他类型资源的实现原理相同,就不一一给出了。首先来看对一幅JPG类型图片进行异或加密的Java实现,由于是第一次给出代码,所以贴上了Java文件“FileEncAndDec.java”的所有内容。

 1 import java.io.File;2 import java.io.InputStream;3 import java.io.OutputStream;4 import java.io.FileInputStream;5 import java.io.FileOutputStream;6 7 public class FileEncAndDec {8     private static final int numOfEncAndDec = 0x99; //加密解密秘钥9     private static int dataOfFile = 0; //文件字节内容
10     public static void main(String[] args) {11
12         File srcFile = new File("桌面.jpg"); //初始文件
13         File encFile = new File("encFile.tif"); //加密文件
14         File decFile = new File("decFile.bmp"); //解密文件
15
16         try {17             EncFile(srcFile, encFile); //加密操作
18         } catch (Exception e) {19             e.printStackTrace();
20         }
21     }
22
23     private static void EncFile(File srcFile, File encFile) throws Exception {24         if(!srcFile.exists()){25             System.out.println("source file not exixt");
26             return;
27         }
28
29         if(!encFile.exists()){30             System.out.println("encrypt file created");
31             encFile.createNewFile();
32         }
33         InputStream fis  = new FileInputStream(srcFile);
34         OutputStream fos = new FileOutputStream(encFile);
35
36         while ((dataOfFile = fis.read()) > -1) {37             fos.write(dataOfFile^numOfEncAndDec);
38         }
39
40         fis.close();
41         fos.flush();
42         fos.close();
43     }
44 }

从代码可以看出,给定的加密秘钥(异或数据,可以在合法范围内随便定义)为十六进制数0x99。图片资源为以中文命名的“桌面.jpg”,加密文件为“encFile.png”,还有值为“decFile.bmp”的String类对象作为解密文件名称。

相对应地,解密的实现几乎和加密相同,只是输入与输出文件不同,看下面代码。

 1 private static void DecFile(File encFile, File decFile) throws Exception {2   if(!encFile.exists()){3     System.out.println("encrypt file not exixt");4     return;5   }6 7   if(!decFile.exists()){8     System.out.println("decrypt file created");9     decFile.createNewFile();
10   }
11
12   InputStream fis  = new FileInputStream(encFile);
13   OutputStream fos = new FileOutputStream(decFile);
14
15   while ((dataOfFile = fis.read()) > -1) {16     fos.write(dataOfFile^numOfEncAndDec);
17   }
18
19   fis.close();
20   fos.flush();
21   fos.close();
22 }

由于加密后的图片文件(保存为PNG类型)是不能直接在图片查看器中打开的,因为其内容已经改变,所以其缩略图标会显示为两朵不同颜色的花。对于其他类型的加密或损坏文件的缩略图标:JPG为山水画,BMP和TIF为画刷涂鸦,GIF为三个不同颜色的几何图形。当然,这些默认的图标应该会因系统而异。

下面给出初始、加密及解密后的图标截图:

和预想的一致,经测试发现以上方法对GIF动画(不是GIF图片,而是可以播放的动画资源)的加密与解密同样适用,代码和截图也就没有区别了,不过还是贴上来:

1 File srcFile = new File("srcFile.gif"); //初始文件
2 File encFile = new File("encFile.gif"); //加密文件
3 File decFile = new File("decFile.gif"); //解密文件

有两点需要注意:

1、在调用加密与解密方法时,必须加上异常处理块(try{…}catch{…},否则编译不通过)。

2、对用来加密或解密的源文件进行打开(读取)操作之前,最好判断其是否存在,免得造成意想不到的错误和时间的浪费。因为若文件不存在,后续的操作都是没有意义的。

今天就先写到这,总结一下吧。文件加密简单地说就是对数据进行变换,虽然一千种方法可能会有一千种一种结果,但是思想是通用的。关键是加密所采用的算法的难易,有时间会对文中提到的算法用Java进行实现。

Java实现文件的加密与解密相关推荐

  1. java的BASE64Encoder,BASE64Decoder加密与解密

    https://blog.csdn.net/weixin_44876457/article/details/89102723 https://blog.csdn.net/weixin_44876457 ...

  2. java AES文件流加密

    java AES文件流加密 文章转载自:https://www.cnblogs.com/gne-hwz/p/14736496.html java工具类-对称加密算法AES 加密文件流 工具类出自jdk ...

  3. c语言程序存为bin程序,对文件进行加密与解密(c语言)-bin文件打开

    操作界面 加密前的文件: 加密后的文件 将加密后的文件解密后即可还原 初始密码为:hujing 开发环境:vc6.0 操作系统:windows 源代码 /*********************** ...

  4. python输出字体的大小_Python密码学编程:文件的加密与解密

    在之前的章节中,编写的程序只能操作较少的信息,这些信息往往是以字符串的形式直接写在代码中的.但本章中的程序可以对整个文件进行加密和解密,文件的大小可以包括成千上万个字符. 本章要点 open()方法. ...

  5. java中md5加密和解密_如何在java中实现md5加密和解密

    如何在java中实现md5加密和解密 关注:273  答案:1  mip版 解决时间 2021-01-19 20:37 提问者精神疯裂 2021-01-19 05:36 如何在java中实现md5加密 ...

  6. c#使用SHA256算法实现对文件的加密和解密

    全栈工程师开发手册 (作者:栾鹏) c#教程全解 c#使用SHA256算法实现对文件的加密和解密 将当期目录的test.txt加密成文件test1.txt,再将加密后的test1.txt文件解密成te ...

  7. Java代码:字符串加密与解密

    Java代码:字符串加密与解密 获取字符串的长度length() 把字符串转为字节数组getBytes() 字节数组转换为字符串String(b) /* *java代码:字符串加密与解密 **/ pa ...

  8. 对文件进行加密和解密

    在Solaris10上,可以使用encrypt和decrypt命令对文件进行加密和解密.文件加密可以防止其它用户看到敏感信息.如:存储用户名和密码的文件. 以下是示例: 1. 把用户名和密码信息存储在 ...

  9. php dse加密,dse-src 这个极其小巧(9k)的加密程序对文件进行加密及解密的速度与资 联合开发网 - pudn.com...

    dse-src 所属分类:加密解密 开发工具:C/C++ 文件大小:20KB 下载次数:1 上传日期:2009-05-04 15:11:23 上 传 者:自由民 说明:  这个极其小巧(9k)的加密程 ...

最新文章

  1. Safari回传值给应用程序
  2. 天池在线编程 2020年9月26日 日常周赛题解
  3. 【转】Linux ln(link) 命令详解
  4. TCGA肿瘤基因数据的访问(二)
  5. RH850中断使用方法
  6. 两阶段最小二乘法原理_什么是两阶段最小二乘法(2sls)?
  7. 解决SAS/EG中某些process出现的WARNING: The font Arial is not available. Albany AMT will be used.
  8. JAVA 去除重复对象方法
  9. 仿蜻蜓FM专辑页面滑动特效
  10. Trie树 与 三分树(Ternary Trees)
  11. UGUI-ContentSizeFitter之最简单实现maxSize限制
  12. UDP实现群聊聊天室
  13. WIN10家庭版安装Hvper-V
  14. [AHK]Windows10中如何只通过键盘就将窗口移动到其他虚拟桌面?
  15. 什么是PCB Testpoints
  16. MATLAB的汽车操纵稳定性仿真分析
  17. MDD 建模驱动设计
  18. JavaScript零基础知识点
  19. 如何填写SEO设置能提升网站排名?
  20. 使用ArcGIS进行拓扑检查

热门文章

  1. int在matlab中的作用,int函数表达的是什么意思
  2. 全球首个基于区块链技术的微信智能名片正式发布
  3. 2023新华为OD机试题 - 入栈出栈(JavaScript) | 刷完必过
  4. 树莓派php5装不上,在树莓派中安装和运行Domoticz
  5. WorkNC使法国汽车模具制造商Julien SA的精加工时间从32个小时减少至14个小时。
  6. laravel solr使用PHP(Laravel)实现Solr全文搜索详细过程
  7. 兔展雷宗民:小团队的基础设施建设之路
  8. 在eNSP模拟器上通过Dot1q终结子接口(单臂路由)实现VLAN间通信
  9. deepin安装问题总结
  10. goland 界面变成中文 修改回英文界面