之前遇到一个需求,本地视频直接放在设备中,防止非法被再次利用,需要对视频进行一个简单的加密,于是本人想来一种奇怪的加密方法,加密分为两步,现对视频进行加密,然后将加密后的视频更改后缀名。好了话不多说,直接上代码。
以下代码是用来加密视频的:
/**
* 文件加解密
*将视频文件的数据流前100个字节中的每个字节与其下标进行异或运算。
*解密时只需将加密过的文件再进行一次异或运算即可。
* @param strFile 源文件绝对路径
* @return
*/
private final int REVERSE_LENGTH = 100;
private boolean EncryptAndDecode(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;
}
}
以下代码是用来修改后缀名的
//文件后缀名的修改
import java.io.*;
/**
* JAVA实现的批量更改文件后缀名的程序。
*
* @author rommnn
*/
public class ExtBatchRename {
/**
* 修改程序。<br>
* 内部递归调用,进行子目录的更名
* @param path
* 路径
* @param from
* 原始的后缀名,包括那个(.点)
* @param to
* 改名的后缀,也包括那个(.点)
*/
public static void reName(String path, String from, String to) {
File f = new File(path);
File[] fs = f.listFiles();
for (int i = 0; i < fs.length; ++i) {
File f2 = fs[i];
if (f2.isDirectory()) {
reName(f2.getPath(), from, to);
} else {
String name = f2.getName();
if (name.endsWith(from)) {
f2.renameTo(new File(f2.getParent() + "/" + name.substring(0, name.indexOf(from)) + to));
}
}
}
}
}
以上就是这种加密方式的所有代码,至于解密肯定就是先将后缀名改回视频后缀名,再调用一次前面视频的加密方法,因为是异或运算,一次就是加密,再来一次就是解密。
网友评论