加入收藏 | 设为首页 | 会员中心 | 我要投稿 均轻资讯网 (https://www.52junqing.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 安全 > 正文

java实现文件加密解密

发布时间:2022-12-06 15:33:11 所属栏目:安全 来源:
导读:  一、对于文件流读写取的方式对比:

  inputStream.read()与OutputStream.write()

  单字节读取,效率低下

  inputStream.read(new byte[801024])与OutputStream.write(new byte[801024])
  一、对于文件流读写取的方式对比:
 
  inputStream.read()与OutputStream.write()
 
  单字节读取,效率低下
 
  inputStream.read(new byte[801024])与OutputStream.write(new byte[801024])
 
  固定数组读取,经测试数组增加到80k左右性能最佳
 
  nputStream.read(inputStream.available()) 与OutputStream.write(inputStream.available())
 
  按文件大小一次性读取文档加密方式,如文件过大有内存溢出风险
 
  BufferedInputStream.read()与BufferedOutputStream.write()
 
  默认有一个8K的缓存数组
 
  二、循环每个字节加解密(此方法效率最低):
 
  1.通过inputStream.read()单字节加密,inputStream.read()返回的是一个字节的内容(0-255之间的数字),可直接异或加密:
 
      @PostMapping("/swlUpload")
      public void swlUpload(MultipartFile file) throws IOException {
          String originalFilename = file.getOriginalFilename();
          InputStream inputStream = file.getInputStream();
          //FileInputStream inputStream = new FileInputStream((File) file);
          byte[] b = new byte[1024];
          FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\"+originalFilename));
          BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
          int  swl = 0;
          while((swl=inputStream.read())!=-1){
              //System.out.println(b);
              bufferedOutputStream.write(swl^9527);
          }
          //6.2用来刷新缓冲区,刷新后可以再次写出
          bufferedOutputStream.flush();
          inputStream.close();
          bufferedOutputStream.close();
      }
  2.通过inputStream.read()单字节解密:
 
      @PostMapping("/swlDownload")
      public void swlDownload(HttpServletResponse response) throws IOException {
          File f2= new File("D:\\108B计划.xlsx");
          boolean exists = f2.exists();
          FileInputStream inputStream = new FileInputStream(f2);
          //byte[] b = new byte[1024];
          String filePath = "108B计划.xlsx";
          //6.1清除buffer缓存
          response.reset();
          response.setContentType("application/octet-stream;charset=UTF-8");
          //response.setHeader("Content-Disposition", "inline; filename="+ new String(filePath.getBytes("UTF-8"), "ISO-8859-1"));// 定义文件名
          //response.setHeader("Content-Disposition", "attachment; filename="+ new String(filePath.getBytes("UTF-8"), "ISO-8859-1"));// 定义文件名
          response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(filePath, "UTF-8"));
          response.setHeader("Pragma", "no-cache");
          response.setHeader("Cache-Control", "no-cache");
          response.setHeader("Expires", " 0");
          ServletOutputStream outputStream = response.getOutputStream();
          BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
          int swl = 0;
          while((swl = inputStream.read())!=-1){
              bufferedOutputStream.write(swl^9527);
          }
          //6.2用来刷新缓冲区,刷新后可以再次写出
          bufferedOutputStream.flush();
          inputStream.close();
          bufferedOutputStream.close();
      }
  三、加载整个文件加解密(效率快,有内存溢出风险):
 
  1.通过inputStream.read(bytes) 加载整个文件,inputStream.read(bytes)返回bytes大小的字节,放入bytes数组中,循环异或加密:
 
      @PostMapping("/swlUpload")
      public void swlUpload(MultipartFile file) throws IOException {
          String originalFilename = file.getOriginalFilename();
          InputStream inputStream = file.getInputStream();
          //FileInputStream inputStream = new FileInputStream((File) file);
          byte[] b = new byte[8*1024];
          
          FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\"+originalFilename));
          BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
          //一、整体io读取、循环加密
          long l = System.currentTimeMillis();
          log.info(String.valueOf(System.currentTimeMillis()));
          int  swl = 0;
          byte[] bytes = new byte[inputStream.available()];
          while((inputStream.read(bytes))!=-1){
              //System.out.println(b);
              for(int i=0;i<bytes.length;i++){
                  bufferedOutputStream.write(bytes[i]^9527);
              }
          }
          //6.2用来刷新缓冲区,刷新后可以再次写出
          bufferedOutputStream.flush();
          inputStream.close();
          bufferedOutputStream.close();
          log.info(String.valueOf(System.currentTimeMillis()));
          log.info(String.valueOf(System.currentTimeMillis()-l));
      }
  2.通过inputStream.read(bytes) 加载整个文件解密:
 
      @PostMapping("/swlDownloadAll")
      public void swlDownloadAll(HttpServletResponse response) throws IOException {
          File f2= new File("D:\\84333c1377d99d970a0984049db926ae.mp4");
          boolean exists = f2.exists();
          FileInputStream inputStream = new FileInputStream(f2);
          //byte[] b = new byte[1024];
          String filePath = "84333c1377d99d970a0984049db926ae.mp4";
          //6.1清除buffer缓存
          response.reset();
          response.setContentType("application/octet-stream;charset=UTF-8");
          //response.setHeader("Content-Disposition", "inline; filename="+ new String(filePath.getBytes("UTF-8"), "ISO-8859-1"));// 定义文件名
          //response.setHeader("Content-Disposition", "attachment; filename="+ new String(filePath.getBytes("UTF-8"), "ISO-8859-1"));// 定义文件名
          response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(filePath, "UTF-8"));
          response.setHeader("Pragma", "no-cache");
          response.setHeader("Cache-Control", "no-cache");
          response.setHeader("Expires", " 0");
          ServletOutputStream outputStream = response.getOutputStream();
          BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
          long l = System.currentTimeMillis();
          log.info(String.valueOf(System.currentTimeMillis()));
          int swl = 0;
          byte[] bytes = new byte[inputStream.available()];
          while((inputStream.read(bytes))!=-1){
              for(int i=0;i<bytes.length;i++){
                  bufferedOutputStream.write(bytes[i]^9527);
              }
          }
          //6.2用来刷新缓冲区,刷新后可以再次写出
          bufferedOutputStream.flush();
          inputStream.close();
          bufferedOutputStream.close();
          log.info(String.valueOf(System.currentTimeMillis()));
          log.info(String.valueOf(System.currentTimeMillis()-l));
      }
  四、小数组加载文件加解密(效率快,无内存溢出风险)【推荐】:
 
  1.通过inputStream.read(b) 加载整个文件,inputStream.read(b)返回b大小的字节,放入b数组中,循环异或加密:
 
      @PostMapping("/swlUploadArray")
      public void swlUploadArray(MultipartFile file) throws IOException {
          String originalFilename = file.getOriginalFilename();
          InputStream inputStream = file.getInputStream();
          //FileInputStream inputStream = new FileInputStream((File) file);
          byte[] b = new byte[8*1024];
          FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\"+originalFilename));
          BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
          //三、小数组循环io读取、循环加密
          long l = System.currentTimeMillis();
          log.info(String.valueOf(System.currentTimeMillis()));
          while((inputStream.read(b))!=-1){
              //System.out.println(b);
              for(int i=0;i<b.length;i++){
                  bufferedOutputStream.write(b[i]^9527);
              }
          }
          //6.2用来刷新缓冲区,刷新后可以再次写出
          bufferedOutputStream.flush();
          inputStream.close();
          bufferedOutputStream.close();
          log.info(String.valueOf(System.currentTimeMillis()));
          log.info(String.valueOf(System.currentTimeMillis()-l));
      }
  2.通过inputStream.read(b) 加载整个文件解密:
 
      @PostMapping("/swlDownloadArray")
      public void swlDownloadArray(HttpServletResponse response) throws IOException {
          File f2= new File("D:\\84333c1377d99d970a0984049db926ae.mp4");
          boolean exists = f2.exists();
          FileInputStream inputStream = new FileInputStream(f2);
          byte[] b = new byte[8*1024];
          String filePath = "84333c1377d99d970a0984049db926ae.mp4";
          //6.1清除buffer缓存
          response.reset();
          response.setContentType("application/octet-stream;charset=UTF-8");
          //response.setHeader("Content-Disposition", "inline; filename="+ new String(filePath.getBytes("UTF-8"), "ISO-8859-1"));// 定义文件名
          //response.setHeader("Content-Disposition", "attachment; filename="+ new String(filePath.getBytes("UTF-8"), "ISO-8859-1"));// 定义文件名
          response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(filePath, "UTF-8"));
          response.setHeader("Pragma", "no-cache");
          response.setHeader("Cache-Control", "no-cache");
          response.setHeader("Expires", " 0");
          ServletOutputStream outputStream = response.getOutputStream();
          BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
          long l = System.currentTimeMillis();
          log.info(String.valueOf(System.currentTimeMillis()));
          int swl = 0;
          while((inputStream.read(b))!=-1){
              for(int i=0;i<b.length;i++){
                  bufferedOutputStream.write(b[i]^9527);
              }
          }
          //6.2用来刷新缓冲区,刷新后可以再次写出
          bufferedOutputStream.flush();
          inputStream.close();
          bufferedOutputStream.close();
          log.info(String.valueOf(System.currentTimeMillis()));
          log.info(String.valueOf(System.currentTimeMillis()-l));
      }
 

(编辑:均轻资讯网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!