android中对文件加密解密的实现

现在项目里面有一个需求,本项目里面下载的视频和文档都不允许通过其他的播放器播放,在培训机构里面这样的需求很多。防止有人交一份钱,把所有的课件就拷给了别人。这样的事情培训机构肯定是不愿意的。现在我项目里面也出了这么个需求。下面介绍一下我的实现。

文件加解密的流程及原理

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

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

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

4、注意事项:

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

主要代码

/**自定义实现简单的文件加密解密工具 * 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); } }

效果如图:

代码就是这么多,都有注释。以后再有这种需求可以直接用。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-09-09 15:58:17

android中对文件加密解密的实现的相关文章

android中对文件加密解密的实现_Android

现在项目里面有一个需求,本项目里面下载的视频和文档都不允许通过其他的播放器播放,在培训机构里面这样的需求很多.防止有人交一份钱,把所有的课件就拷给了别人.这样的事情培训机构肯定是不愿意的.现在我项目里面也出了这么个需求.下面介绍一下我的实现. 文件加解密的流程及原理 1.加密方法:存储文件时,从输入流中截取文件的字节数组,对字节数组进行加密,至于加密的方式和算法就可以视需求而定了,然后把加密后的字节数组写入到文件中,最后生成加密后的文件: 2.解密方法:同加密方法一样,只不过是对字节数据进行解密

Qt中json文件加密问题

问题描述 Qt中json文件加密问题 正在写一个登录认证的程序(有一个登录框),个人并未采用C/S的基于数据库的认证过程,仅仅只是在本地通过读写文件来进行授权用户的认证以及添加等操作.个人希望用json文件来保存授权用户的信息(username,password),但是如果仅仅使用json文件,在使用时直接只读json文件就可以得到用户的密码,其安全性很低. 所以我现在有个问题:在Qt的json中,是否可以采取某种方式来对json文件进行加密处理,或者采取何种方式对password进行加密? 当

javascript将url中的参数加密解密代码_javascript技巧

今天在做一个老项目时,遇到一个需求,在javascript将url中的参数加密解密,从网上找发现了这段有用的代码: 复制代码 代码如下: <SCRIPT LANGUAGE="JavaScript">    <!-- Begin    function Encrypt(str, pwd) {        if(str=="")return "";        str = escape(str);        if(!pwd

android中创建文件夹。。。。。

问题描述 android中创建文件夹..... #android中不能创建文件夹,哪里都不能! 调试返回结果底下三个全是false void createFile(File onClickFile, String fileName) { File f = new File(onClickFile.getAbsolutePath(), fileName); if (!f.exists()) { try { if (f.mkdirs()) { Toast.makeText(listActivity,

在 android 中的文件中输入数据

问题描述 在 android 中的文件中输入数据 下面的代码重写了文件.我想让原来的数据还保持一致. osw..append (data); 但是没有获得结果. public void WriteSettings(Context context String data){ FileOutputStream fOut = null; OutputStreamWriter osw = null; try{ fOut = context.openFileOutput(""abc.txt&qu

android中BuildConfig文件和R文件是干什么用的?

问题描述 android中BuildConfig文件和R文件是干什么用的? android中BuildConfig文件和R文件是干什么用的? android中BuildConfig文件和R文件是干什么用的? 解决方案 1.src:存放所有的*.java源程序. 2.gen:为ADT插件自动生成的代码文件保存路径,里面的R.java将保存所有的资源ID. 3.assets:可以存放项目一些较大的资源文件,例如:图片.音乐.字体等. 4.res:可以存放项目中所有的资源文件,例如:图片(*.png.

无法在android中写入文件,只能读取文件系统

问题描述 无法在android中写入文件,只能读取文件系统 我想在 android 中写入一个文件. private void writeScoreToFile(BlastScore result) { try{ FileWriter fstream = new FileWriter(CaptureActivity.BLAST_SCORES,true); BufferedWriter out = new BufferedWriter(fstream); out.write(Integer.toS

求帮助啊 急用啊-利用C语言设计简单的文件加密解密程序

问题描述 利用C语言设计简单的文件加密解密程序 利用C语言设计简单的文件加密解密程序,并通过代码实现,希望得到源代码. 解决方案 最简单的用xor实现加密.http://blog.csdn.net/fdipzone/article/details/20413631 解决方案二: http://blog.163.com/chatter@126/blog/static/12766566120101020102247603/http://blog.csdn.net/szhhck/article/det

简单加密-老手给新手下的题,求解答,用c#简单的对文件加密解密

问题描述 老手给新手下的题,求解答,用c#简单的对文件加密解密 用c#将文件(mp3.mp4等视频音乐文件),转换成数组之类的,并在后面+1,简单的使文件加密,让别人打不开,解密时再减去1,让文件还原,还能继续播放.求代码啊刚毕业,啥也不会.新手跪求啊,已经折腾了一个晚上,还没写出来. 解决方案 这个简单: 加密: var data = File.ReadAllBytes("c:\xx.mp3"); File.WriteAllBytes("c:\xx1.mp3",