android端ios端 视频、文件高效加密

来源:互联网 发布:有线网络ip地址 编辑:程序博客网 时间:2024/05/16 23:43
 近期做项目遇到加密问题,通过在网上查阅大量资料,看见不少人提出通过给文件头部和尾部添加数据等方法,自己测试了一下,一个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 一起探讨





0 0
原创粉丝点击