近期做项目遇到加密问题,通过在网上查阅大量资料,看见不少人提出通过给文件头部和尾部添加数据等方法,自己测试了一下,一个50m的文件通过这种方法,加解密时需要5s以上(用到了复制文件操作),这肯定不适合我的需求,所以自己借鉴网上的资料写了一个通过与数据头部按位'与'运算来实现加密的方法
java版
public classViodeUtils {
privateString TAG = "finished";
publicboolean encrypt(String strFile) {
if(strFile.endsWith(".tem")){
Log.i(TAG, "encrypt: 无需加密");
return false;
}
int len = 100;
try {
File f = new File(strFile);
RandomAccessFile raf = new RandomAccessFile(f, "rw");
long totalLen = raf.length();
if (totalLen < 100)
len = (int) totalLen;
FileChannel channel = raf.getChannel();
MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, 100);
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();
Log.i(TAG, "encrypt: 加密成功");
renameFile(strFile,strFile+".tem");
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
publicString noEncrypt(String strFile) {
if(!strFile.endsWith(".tem")){
Log.i(TAG, "encrypt: 无需解密");
return strFile;
}
int len = 100;
try {
File f = new File(strFile);
RandomAccessFile raf = new RandomAccessFile(f, "rw");
long totalLen = raf.length();
if (totalLen < 100)
len = (int) totalLen;
FileChannel channel = raf.getChannel();
MappedByteBuffer buffer = channel.map(
FileChannel.MapMode.READ_WRITE, 0,100);
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();
Log.i(TAG, "encrypt: 解密成功");
String path =renameFile(strFile,strFile.substring(0,strFile.length()-4));
return path;
} catch (Exception e) {
e.printStackTrace();
return strFile;
}
}
publicString renameFile(String file, String toFile){
File toBeRenamed = new File(file);
//检查要重命名的文件是否存在,是否是文件
if (!toBeRenamed.exists() || toBeRenamed.isDirectory()) {
Log.i(TAG, "encrypt: 文件已存在");
return file;
}
File newFile = new File(toFile);
//修改文件名
if (toBeRenamed.renameTo(newFile)) {
Log.i(TAG, "encrypt: 重命名文件为"+toFile+"成功");
return toFile;
} else {
Log.i(TAG, "encrypt: 重命名文件失败");
return file;
}
总结就是打开一个文件流,取出头部前100个byte,然后对这100个byte按位 '与'运算,然后再放回去,已经加密的文件要改后缀名,通过文件的后缀名判断文件是否已加密状态
解密就是对着100个byte重新 '与'运算一遍
这里可以取出文件任何位置的数据进行局部 '与'运算加密,也可以对局部用网上流行的加密算法加解密(当然这样有可能遇到各种各样的问题),安全性应该还是有保障的
根据这种思想 ios swift版 我就不详细说明了,直接上代码
funcreadMyFile(filename: NSString) -> Bool{
let len = 100//操作的个数
let fp = fopen(filename.UTF8String, "r+")
if fp == nil {
return false
}
var buffer: [UInt8] = Array(count: len, repeatedValue: 0)
fread(&buffer,1,len,fp);//读出前100个字节
print(buffer.description)
for i in 0 ..< len {
let rawByte = buffer[i]
let tmp = (rawByte ^ UInt8(i))
buffer[i] = tmp
}
print(buffer.description)
fseek(fp, 0, SEEK_SET) //把文件指针移动到开头
fwrite(buffer,len,1,fp)//写入len字符
fclose(fp)
print("加密解密成功")
return true
}
如有大家还有更好的加密方法可以我加qq285298984 一起探讨
android端ios端视频、文件高效加密
最新推荐文章于 2021-05-26 12:18:56 发布