Android 视频文件加密
项目开发中,之前一直是直接播放网络视频,后来要求加上视频缓存的功能,但是这些视频又都是要付费才能观看的,这就涉及到视频的版权问题。为了防止一个用户付费下载后,传播视频,就需要给视频文件加密,在播放时解密,只让视频在我的应用中播放。经过几天的百度、google,然后测试。找到了以下几种加密方法。
一、DES加密。用java中提供的加密包。加密代码如下:
package com.example.progressbardemo; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.security.Key; import javax.crypto.Cipher; import javax.crypto.CipherInputStream; import javax.crypto.spec.SecretKeySpec; /** * Created by Administrator on 2016/1/14. */ public class FileDES {/** * 加密解密的key */ private Key mKey; /** * 解密的密码 */ private Cipher mDecryptCipher; /** * 加密的密码 */ private Cipher mEncryptCipher; public FileDES(String key) throws Exception {initKey(key); initCipher(); }/** * 创建一个加密解密的key * * @param keyRule */ public void initKey(String keyRule) {byte[] keyByte = keyRule.getBytes(); // 创建一个空的八位数组,默认情况下为0 byte[] byteTemp = new byte[8]; // 将用户指定的规则转换成八位数组 for (int i = 0; i < byteTemp.length && i < keyByte.length; i++) {byteTemp[i] = keyByte[i]; }mKey = new SecretKeySpec(byteTemp, "DES"); }/*** * 初始化加载密码 * * @throws Exception */ private void initCipher() throws Exception {mEncryptCipher = Cipher.getInstance("DES"); mEncryptCipher.init(Cipher.ENCRYPT_MODE, mKey); mDecryptCipher = Cipher.getInstance("DES"); mDecryptCipher.init(Cipher.DECRYPT_MODE, mKey); }/** * 加密文件 * * @param in * @param savePath 加密后保存的位置 */ public void doEncryptFile(InputStream in, String savePath) {if (in == null) {System.out.println("inputstream is null"); return; }try {CipherInputStream cin = new CipherInputStream(in, mEncryptCipher); OutputStream os = new FileOutputStream(savePath); byte[] bytes = new byte[1024]; int len = -1; while ((len = cin.read(bytes)) > 0) {os.write(bytes, 0, len); os.flush(); }os.close(); cin.close(); in.close(); System.out.println("加密成功"); } catch (Exception e) {System.out.println("加密失败"); e.printStackTrace(); }}/** * 加密文件 * * @param filePath 需要加密的文件路径 * @param savePath 加密后保存的位置 * @throws FileNotFoundException */ public void doEncryptFile(String filePath, String savePath) throws FileNotFoundException {doEncryptFile(new FileInputStream(filePath), savePath); }/** * 解密文件 * * @param in */ public void doDecryptFile(InputStream in, String path) {if (in == null) {System.out.println("inputstream is null"); return; }try {CipherInputStream cin = new CipherInputStream(in, mDecryptCipher); OutputStream outputStream = new FileOutputStream(path); byte[] bytes = new byte[1024]; int length = -1; while ((length = cin.read(bytes)) > 0) {outputStream.write(bytes, 0, length); outputStream.flush(); }cin.close(); in.close(); System.out.println("解密成功"); } catch (Exception e) {System.out.println("解密失败"); e.printStackTrace(); }}/** * 解密文件 * * @param filePath 文件路径 * @throws Exception */ public void doDecryptFile(String filePath, String outPath) throws Exception {doDecryptFile(new FileInputStream(filePath), outPath); }public static void main(String[] args) throws Exception {FileDES fileDES = new FileDES("spring.sky"); fileDES.doEncryptFile("d:/a.txt", "d:/b"); //加密 // fileDES.doDecryptFile("d:/b"); //解密 }}
经测试,15兆的视频,加密解密都可以成功,但是耗时太长,加密大概耗时20s。很显然,效率太低。视频文件一般都是几百兆,用此方法加密的时间就长的有点离谱了。
上面这种方式是将视频文件中的每个字节都经过加密算法进行了加密,显示安全性比较高,耗时也长。但是视频文件比较特殊,我们只要将文件的前面多少个字节进行加密,这样播放器就无法识别这个文件的编码,就无法播放了。
二、将视频文件的数据流前100个字节中的每个字节与其下标进行异或运算。解密时只需将加密过的文件再进行一次异或运算即可。
加密解密方法如下:
private final int REVERSE_LENGTH = 100; /** * 加解密 * * @param strFile 源文件绝对路径 * @return */ private boolean encrypt(String strFile) {int len = REVERSE_LENGTH; try {File f = new File(strFile); RandomAccessFile raf = new RandomAccessFile(f, "rw"); long totalLen = raf.length(); if (totalLen < REVERSE_LENGTH)len = (int) totalLen; FileChannel channel = raf.getChannel(); MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, REVERSE_LENGTH); byte tmp; for (int i = 0; i < len; ++i) {byte rawByte = buffer.get(i); tmp = (byte) (rawByte ^ i); buffer.put(i, tmp); }buffer.force(); buffer.clear(); channel.close(); raf.close(); return true; } catch (Exception e) {e.printStackTrace(); return false; } }
此方法加密耗时很短。
加密时用到了MappedByteBuffer类。具体含义看此博客http://my.oschina.net/swearyd7/blog/167663?fromerr=dzP0A3fc
测试过程中,我将REVERSE_LENGTH 这个常量设置为1,只加密视频文件的前1个字节,没有任何效果。改成2个字节后,加密后的视频就无法播放了,大于等于2个字节都能加密成功。
Android 视频文件加密相关推荐
- Alist云盘视频加密助手:支持云盘视频文件加密与在线播放,不用再担心视频文件被和谐了!
转自:https://www.cnblogs.com/allvideo/p/17329494.html 在当前娱乐资源丰富的时代,人们每天都在接触各种视频资源.然而,网盘限速.版权审核.视频分级等问题 ...
- 保护个人隐私视频文件加密方法两小招
保护个人隐私视频文件加密方法两小招 前段时间网络上沸沸扬扬的艳照门事件,让那些平日里光鲜照人的大明星在老百姓心中的形象一落千丈,这里面就涉及到很多个人隐私文件如何保密的问题,自己存在电脑你的视频文件如 ...
- android视频文件能删吗,如何从Android恢复已删除的视频
作者:Selena Komez11月更新了21,2016 "我不小心从三星Galaxy S6中删除了整个视频文件,所以我想知道是否有任何方法可以从我的Android恢复已删除的视频?谷歌给了 ...
- android 大文件加密,如何在android中加密大视频文件
我有一个应用程序,我正在使用该代码来解密已加密的文件.文件位置是"/mnt/sdcard/myfolder/test.mp4". test.mp4文件大小约为20MB.如何在and ...
- Android AES文件加密 ECB模式
项目过程中遇到一个新需求,对文件进行AES加密解密,要求用ECB模式,这里记录一下 网上找了很多资料,对字符串进行加密很多,可是我需要的是对文件进行加密,一开始的思路是把文件内容读出来,然后对这些内容 ...
- Android AES 文件加密解密
几番折磨终有结果,现将Demo整理出来... [java] view plain copy package com.king.zjc; import java.io.File; import ja ...
- android中文件加密和解密的实现
最近项目中需要用到加解密功能,言外之意就是不想让人家在反编译后通过不走心就能获取文件里一些看似有用的信息,但考虑到加解密的简单实现,这里并不使用AES或DES加解密 为了对android中assets ...
- android pdf 文件加密,加密PDF与PdfBox-Android不兼容
我用Foxit和AdobeReader检查结果. AdobeReader说我的文件已损坏,但Foxit向我显示密码对话框.但是,然后我可以尝试我想要的福昕也无法解密我的文件. 如果我设置keyLeng ...
- android aes文件加密,如何在Android中使用AES从SD卡加密文件?
你应该看看: CipherInputStream和CipherOutputStream.它们用于加密和解密字节流. 我有一个名为的文件cleartext.该文件包含: Hi, I'm a clear ...
最新文章
- 数字图像处理——第九章 形态学图像处理
- 程序员:如何成为一个全栈的工程师?
- Python模块的四种形式
- [BUUCTF-pwn]——wustctf2020_name_your_dog
- pb90代码如何连接sql2008r2_如何使用 HTTP Headers 来保护你的 Web 应用
- AKI-H8串口通信
- spark学习-72-源代码:Endpoint模型介绍(4)-Spark为何使用Netty通信框架替代Akka
- Object中Equals和ReferenceEquals不解之谜
- 【高等数学笔记】闭包、孤立点、导集、内点、边界的关系
- css插件载进去ps里面,CSS3Ps(ps图层插件)官方版
- 先分号分隔 然后逗号分割c语言,分隔符的用法
- 说的话可以转换为文字的笔记APP
- 2022安全员-C证试题模拟考试平台操作
- 耀耀学院task1-task3练习总结
- Qt使用三点坐标画圆弧
- git pull 是到工作区还是暂存区_我把git想简单了
- 关于JSCH使用自义定连接池说明
- Map训练(三国武力值)
- 串口定义以及串口交叉线的制作
- tomcat目录及结构