文件加解密的流程及原理

1、加密方法:存储文件时,从输入流中截取文件的字节数组,对字节数组进行加密,至于加密的方式和算法就可以视需求而定了,然后把加密后的字节数组写入到文件中,最后生成加密后的文件;

2、解密方法:同加密方法一样,只不过是对字节数据进行解密,最后生成明文文件;

3、加密算法:android系统本身引入了javax包的Cipher类,这个类里提供了各种各样的通用的加密方式,如AES对称加密等;该程序中有个CipherUtil工具类,里面有一些简单的使用Cipher进行AES加解密的方法;当然最好还是好好学习一下Cipher类的使用;

4、注意事项:

        a、如何判断一个文件是加密后的文件,最简单的方法就是对加密后的文件统一增加一个后缀名,然后在解密之后将这个后缀名去除,还原回原有文件格式;如:密文文件的统一后缀名为“.cipher”,明文文件名为"测试.txt",加密后的密文文件应该为“测试.txt.cipher”;b、加密文件时还有一个重要的注意事项,就是加密后的密文和明文的长度是否相同,如果文件时一次读取出所有字节数组进行加密的话不用担心这个问题,但是当对文件分次读取加密或分段加密的话,就不得不考虑这个问题了,最方便的方法就是保证明文和加密后的密文长度相同;如果长度不同,由于是分段加密的,密文是由一段一段子密文拼接成的,解密时会找不到每段子密文,因为不知道每段子密文的长度是多少;

主要代码

/**自定义实现简单的文件加密解密工具* Created by zhangshuo on 2016/6/28.*/
public class CustomFileCipherUtil {/*** 加密后的文件的后缀*/public static final String CIPHER_TEXT_SUFFIX = ".cipher";/*** 加解密时以32K个字节为单位进行加解密计算*/private static final int CIPHER_BUFFER_LENGHT = 32 * 1024;/*** 加密,这里主要是演示加密的原理,没有用什么实际的加密算法** @param filePath 明文文件绝对路径* @return*/public static boolean encrypt(String filePath, CipherListener listener) {try {long startTime = System.currentTimeMillis();File f = new File(filePath);RandomAccessFile raf = new RandomAccessFile(f, "rw");long totalLenght = raf.length();FileChannel channel = raf.getChannel();long multiples = totalLenght / CIPHER_BUFFER_LENGHT;long remainder = totalLenght % CIPHER_BUFFER_LENGHT;MappedByteBuffer buffer = null;byte tmp;byte rawByte;//先对整除部分加密for(int i = 0; i < multiples; i++){buffer = channel.map(FileChannel.MapMode.READ_WRITE, i * CIPHER_BUFFER_LENGHT, (i + 1) * CIPHER_BUFFER_LENGHT);//此处的加密方法很简单,只是简单的异或计算for (int j = 0; j < CIPHER_BUFFER_LENGHT; ++j) {rawByte = buffer.get(j);tmp = (byte) (rawByte ^ j);buffer.put(j, tmp);if(null != listener){listener.onProgress(i * CIPHER_BUFFER_LENGHT + j, totalLenght);}}buffer.force();buffer.clear();}//对余数部分加密buffer = channel.map(FileChannel.MapMode.READ_WRITE, multiples * CIPHER_BUFFER_LENGHT, multiples * CIPHER_BUFFER_LENGHT + remainder);for (int j = 0; j < remainder; ++j) {rawByte = buffer.get(j);tmp = (byte) (rawByte ^ j);buffer.put(j, tmp);if(null != listener){listener.onProgress(multiples * CIPHER_BUFFER_LENGHT + j, totalLenght);}}buffer.force();buffer.clear();channel.close();raf.close();//对加密后的文件重命名,增加.cipher后缀
//            f.renameTo(new File(f.getPath() + CIPHER_TEXT_SUFFIX));Log.d("加密用时:", (System.currentTimeMillis() - startTime) /1000 + "s");return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 解密,这里主要是演示加密的原理,没有用什么实际的加密算法** @param filePath 密文文件绝对路径,文件需要以.cipher结尾才会认为其实可解密密文* @return*/public static boolean decrypt(String filePath, CipherListener listener) {try {long startTime = System.currentTimeMillis();File f = new File(filePath);
//            if(!f.getPath().toLowerCase().endsWith(CIPHER_TEXT_SUFFIX)){
//                //后缀不同,认为是不可解密的密文
//                return false;
//            }RandomAccessFile raf = new RandomAccessFile(f, "rw");long totalLenght = raf.length();FileChannel channel = raf.getChannel();long multiples = totalLenght / CIPHER_BUFFER_LENGHT;long remainder = totalLenght % CIPHER_BUFFER_LENGHT;MappedByteBuffer buffer = null;byte tmp;byte rawByte;//先对整除部分解密for(int i = 0; i < multiples; i++){buffer = channel.map(FileChannel.MapMode.READ_WRITE, i * CIPHER_BUFFER_LENGHT, (i + 1) * CIPHER_BUFFER_LENGHT);//此处的解密方法很简单,只是简单的异或计算for (int j = 0; j < CIPHER_BUFFER_LENGHT; ++j) {rawByte = buffer.get(j);tmp = (byte) (rawByte ^ j);buffer.put(j, tmp);if(null != listener){listener.onProgress(i * CIPHER_BUFFER_LENGHT + j, totalLenght);}}buffer.force();buffer.clear();}//对余数部分解密buffer = channel.map(FileChannel.MapMode.READ_WRITE, multiples * CIPHER_BUFFER_LENGHT, multiples * CIPHER_BUFFER_LENGHT + remainder);for (int j = 0; j < remainder; ++j) {rawByte = buffer.get(j);tmp = (byte) (rawByte ^ j);buffer.put(j, tmp);if(null != listener){listener.onProgress(multiples * CIPHER_BUFFER_LENGHT + j, totalLenght);}}buffer.force();buffer.clear();channel.close();raf.close();//对加密后的文件重命名,增加.cipher后缀
//            f.renameTo(new File(f.getPath().substring(f.getPath().toLowerCase().indexOf(CIPHER_TEXT_SUFFIX))));Log.d("解密用时:", (System.currentTimeMillis() - startTime) / 1000 + "s");return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 用于加解密进度的监听器*/public interface CipherListener{void onProgress(long current, long total);}
}

截图

Demo下载地址:

https://github.com/ZhangSir/TestCipher

Android文件的加密与解密相关推荐

  1. Android 文件的加密及解密

    文件加密及解密 1. 保护隐私数据不被未授权访问: 什么是加密 1. 保护隐私数据不被未授权访问: 2. 用于隐藏真实数据,进行安全的数据传递: 3. 避免数据被第三方截获: 2. 用于隐藏真实数据, ...

  2. android 文件加密解决方法,一种Android平台的文件快速加密以及解密方法与流程

    本发明属于数据安全领域,具体涉及一种Android平台的文件快速加密以及解密方法. 背景技术: 目前移动办公系统极大地提升了企.事业单位的工作效率,而带装有办公应用的智能设备中会存储一些较高机密性的文 ...

  3. 【数据安全】3. Android 文件级加密(File-based Encryption)技术介绍

    1. 概览  1.1 设计概览 采用文件级加密时: 可以使用不同的密钥对不同的文件进行加密,也可以对加密文件单独解密 可以有的放矢,没有安全要求的文件可以不加密 支持多用户,不同用户使用不同的密钥 基 ...

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

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

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

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

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

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

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

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

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

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

  9. 服务器文件加密解密,刀片加密服务器的文件如何加密和解密

    为了解决信息传输到信息存储过程中的存在的信息安全问题,我们应用到了一种刀片加密服务器,那么什么是刀片加密服务器,刀片加密服务器中的文件如何加密和解密,我们今天就来看一下. 一.刀片加密服务器 1.刀片 ...

最新文章

  1. Activiti工作流之网关
  2. 深入理解CRITICAL_SECTION
  3. 使用@RequestParam注解和泛型遇到的问题
  4. EF中使用SQL语句或存储过程
  5. python有什么用-python都可以做什么用
  6. dataframe 上下拼接_pandas DataFrame 的横向纵向拼接组合
  7. SSRF 服务器端请求伪造
  8. c语言链表小甲鱼,有大佬做过小甲鱼双向链表实践吗小甲鱼
  9. Lesson 17.11 案例一:SVHN街道实景门牌识别
  10. 巨详细,大电流线性电源(LDO)原理,看完你就明白了
  11. android glide缺少方法,android - 无法膨胀且找不到类android支持设计的行为BottomSheetBehavior - 堆栈内存溢出...
  12. mc服务器常用指令_mc服务器新手指令
  13. 计算机用户组命令,组策略命令大全
  14. mysql在线编辑器
  15. 【BZOJ4355】Play with sequence 线段树
  16. OpenCV warpAffine做图像旋转变换90度黑边问题
  17. 工信部将加强网站备案、域名等网络管理
  18. Function中的apply函数的应用
  19. 日期转化为时间戳,英文的日期转为日期格式
  20. sEMG项目总结(1)灵巧手控制系统

热门文章

  1. Linux fastAdmin安装出现 你所浏览的页面暂时无法访问-Poison
  2. 教你如何阅读本书,如何学好软件设计——软件设计精要与模式前言
  3. python并发编程补充
  4. 电影之记忆8:(第五元素)
  5. 麻将服务端架设linux,湖南房卡麻将客户端/服务器端完整源码及编译教程
  6. 电机与拖动基础(上)
  7. 4月30日世界表白日_世界表白日是什么几月几号啊?
  8. JAVA 8 Stream 常用操作
  9. 【嵌入式学习-STM32F103-USART串口通信】
  10. CoinUp:元宇宙解析“未来天堂”