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

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

文件与字串

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 importjava.io.File;2 importjava.io.InputStream;3 importjava.io.OutputStream;4 importjava.io.FileInputStream;5 importjava.io.FileOutputStream;6

7 public classFileEncAndDec {8 private static final int numOfEncAndDec = 0x99; //加密解密秘钥

9 private static int dataOfFile = 0; //文件字节内容

10 public static voidmain(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) throwsException {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 = newFileInputStream(srcFile);34 OutputStream fos = newFileOutputStream(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) throwsException {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 = newFileInputStream(encFile);13   OutputStream fos = newFileOutputStream(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上传加密_Java实现文件的加密与解密相关推荐

  1. java 上传断点续传_JAVA大文件上传断点续传解决方案

    javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 Save 改进后的代码不需要for ...

  2. java上传下载_Java文件上传与文件下载实现方法详解

    本文实例讲述了Java文件上传与文件下载实现方法.分享给大家供大家参考,具体如下: Java文件上传 数据上传是客户端向服务器端上传数据,客户端向服务器发送的所有请求都属于数据上传.文件上传是数据上传 ...

  3. java上传ftp_java实现FTP文件上传与文件下载

    本文实例为大家分享了两种java实现FTP文件上传下载的方式,供大家参考,具体内容如下 第一种方式: package com.cloudpower.util; import java.io.File; ...

  4. java图片上传下载_java web 文件上传与下载

    组件工作流程:WEB服务器request ServletFil eupLoad DiskFileItem Factory代表普通字段的FileItem代表上传文件1FileItem代表上传文件2Fil ...

  5. java web 上传附件_JAVA WEB文件上传步骤

    JAVA WEB文件上传步骤如下: 实现 Web 开发中的文件上传功能,两个操作:在 Web 页面添加上传输入项,在 Servlet 中读取上传文件的数据并保存在本地硬盘中. 1.Web 端上传文件. ...

  6. java图片上传下载_Java中文件上传下载 --使用Minio

    Minio模板类: @RequiredArgsConstructor public class MinioTemplate implements InitializingBean { private ...

  7. java图片上传下载_java实现文件的上传和下载

    1. servlet 如何实现文件的上传和下载? 1.1上传文件 参考自:http://blog.csdn.net/hzc543806053/article/details/7524491 通过前台选 ...

  8. java上传组件_java上传组件FileUpload

    如果表单中有文件要上传,也就是有 就需要在form标签中添加enctype="multipart/form-data"属性 如果添加此属性,在操作 页面servlet中,用requ ...

  9. aws s3 獲取所有文件_通过Java上传下载AWS S3文件,并解决文件数量超过1000的问题...

    1 前言 Amazon S3 (Simple Storage Service)是很常用的文件存储服务,我们的场景是上游把流水文件放到S3,我们再从S3读取并对账. 2 初始化S3 首先要获取相关的账号 ...

  10. java上传网络图片_java网络编程之图片上传

    输入输出流核心代码 所有的文件传输都是靠流,其中文件复制最具代表性.输入流和输出流,从输入流中读取数据写入到输出流中. InputStream in =输入源; OutputStream os=输出目 ...

最新文章

  1. windows计算器
  2. ​Rust最受喜爱却少有人用,Python仅排第六,2021全球开发者调查报告出炉
  3. C的function call與stack frame心得
  4. Hibernate脏检查的剖析
  5. Android 音频开发(三) 如何播放一帧音频数据上
  6. c语言学习-编写函数计算式子:S=2*1*1!+2*2*2!+……+2n*n!的值。要求编写自定义函数分别求解2n和n!,在编写求解S的函数。
  7. 计算机三级标题,计算机三级考试题目
  8. python控制svn_jenkins+svn+python的使用
  9. 如何在 Mac 上的“屏幕使用时间”中设置限定通信?
  10. PHPstorm链接服务器自动保存
  11. matlab2018a安装激活教程
  12. 常见容错机制:failover、failback、failfast、failsafe
  13. linux 浮点测试,浮点运算性能测试
  14. VS Code —— 介绍如何配置快捷代码片段和一些自用插件
  15. k3s 离线部署指南
  16. 【HenCoder】HTTPS 为什么是安全的
  17. 【python基础】小练习③——华氏温度与摄氏温度转化
  18. oracle与u8比较,看网友的用友U8、金蝶K3、SAP、Oracle几大模块比较
  19. Mesalink v1.0.0 发布,正式支持 TLS 1.3 和 IPv6,支持CMake编译,支持Windows,实现生产环境可用...
  20. windows与mac文件夹共享

热门文章

  1. 物联网挑战赛【从零到一】
  2. 程序猿之国庆有空吗?
  3. QPalette类详细使用方法
  4. 【BeEF】Ubuntu 20.04安装BeEF
  5. 第三种最小生成树算法 Borůvka算法
  6. STM32CubeMX学习笔记(50)——USB接口使用(DFU固件升级)
  7. 物联网技术发展前景_3种推动物联网发展的技术
  8. 百度地图截取指定区域坐标(可伸拉标记点)
  9. vue项目中页面打印插件(去除页眉页脚)
  10. 【MATLAB】NSGA-2优化算法整定PID控制器参数(四)—— 一阶带时延的被控对象