二、将视频文件的数据流前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个字节都能加密成功。