Java实现文件的加密与解密

  最近在做一个项目,需要将资源文件(包括图片、动画等类型)进行简单的加密后再上传至云上的服务器,而在应用程序中对该资源使用前先将读取到的文件数据进行解密以得到真正的文件信息。此策略的原因与好处是将准备好的资源存储在云上,使用时通过网络进行读取即可,减少了应用程序本身的大小。这一点对于移动应用尤其重要,特别是在资源量较大且需要对其进行保护的时候。毕竟在目前所处的大环境下,要想复制一款软件不难,那真正宝贵的就是不容易找到的资源了。

  先对文件与加密的相关知识做一个极为简单的科普(知道的可以跳过)。

  文件与字串

  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”的所有内容。

import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class FileEncAndDec {
    private static final int numOfEncAndDec = 0x99; //加密解密秘钥
    private static int dataOfFile = 0; //文件字节内容
    public static void main(String[] args) {

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/bc34f499d0e893c8d6018b96b6bfddf9.html