iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >android中对文件加密解密的实现
  • 595
分享到

android中对文件加密解密的实现

加密加密解密Android 2022-06-06 07:06:55 595人浏览 泡泡鱼
摘要

现在项目里面有一个需求,本项目里面下载的视频和文档都不允许通过其他的播放器播放,在培训机构里面这样的需求很多。防止有人交一份钱,把所有的课件就拷给了别人。这样的事情培训机构肯定

现在项目里面有一个需求,本项目里面下载的视频和文档都不允许通过其他的播放器播放,在培训机构里面这样的需求很多。防止有人交一份钱,把所有的课件就拷给了别人。这样的事情培训机构肯定是不愿意的。现在我项目里面也出了这么个需求。下面介绍一下我的实现。

文件加解密的流程及原理

1、加密方法:存储文件时,从输入流中截取文件的字节数组,对字节数组进行加密,至于加密的方式和算法就可以视需求而定了,然后把加密后的字节数组写入到文件中,最后生成加密后的文件;

2、解密方法:同加密方法一样,只不过是对字节数据进行解密,最后生成明文文件;

3、加密算法:Android系统本身引入了javax包的Cipher类,这个类里提供了各种各样的通用的加密方式,如AES对称加密等;该程序中有个CipherUtil工具类,里面有一些简单的使用Cipher进行AES加解密的方法;当然最好还是好好学习一下Cipher类的使用;

4、注意事项:

如何判断一个文件是加密后的文件,最简单的方法就是对加密后的文件统一增加一个后缀名,然后在解密之后将这个后缀名去除,还原回原有文件格式;如:密文文件的统一后缀名为“.cipher”,明文文件名为"测试.txt",加密后的密文文件应该为“测试.txt.cipher”; 加密文件时还有一个重要的注意事项,就是加密后的密文和明文的长度是否相同,如果文件时一次读取出所有字节数组进行加密的话不用担心这个问题,但是当对文件分次读取加密或分段加密的话,就不得不考虑这个问题了,最方便的方法就是保证明文和加密后的密文长度相同;如果长度不同,由于是分段加密的,密文是由一段一段子密文拼接成的,解密时会找不到每段子密文,因为不知道每段子密文的长度是多少;

主要代码


 
public class CustomFileCipherUtil { 
   
  public static final String CIPHER_TEXT_SUFFIX = ".cipher"; 
   
  private static final int CIPHER_BUFFER_LENGHT = 32 * 1024; 
   
  public static boolean encrypt(String filePath, CipherListener listener) { 
    try { 
      long startTime = System.currentTimeMillis(); 
      File f = new File(filePath); 
      RandoMaccessFile raf = new RandomAccessFile(f, "rw"); 
      long totalLenght = raf.length(); 
      FileChannel channel = raf.getChannel(); 
      long multiples = totalLenght / CIPHER_BUFFER_LENGHT; 
      long remainder = totalLenght % CIPHER_BUFFER_LENGHT; 
      MappedByteBuffer buffer = null; 
      byte tmp; 
      byte rawByte; 
      //先对整除部分加密 
      for(int i = 0; i < multiples; i++){ 
        buffer = channel.map( 
            FileChannel.MapMode.READ_WRITE, i * CIPHER_BUFFER_LENGHT, (i + 1) * CIPHER_BUFFER_LENGHT); 
        //此处的加密方法很简单,只是简单的异或计算 
        for (int j = 0; j < CIPHER_BUFFER_LENGHT; ++j) { 
          rawByte = buffer.get(j); 
          tmp = (byte) (rawByte ^ j); 
          buffer.put(j, tmp); 
          if(null != listener){ 
            listener.onProgress(i * CIPHER_BUFFER_LENGHT + j, totalLenght); 
          } 
        } 
        buffer.force(); 
        buffer.clear(); 
      } 
      //对余数部分加密 
      buffer = channel.map( 
          FileChannel.MapMode.READ_WRITE, multiples * CIPHER_BUFFER_LENGHT, multiples * CIPHER_BUFFER_LENGHT + remainder); 
      for (int j = 0; j < remainder; ++j) { 
        rawByte = buffer.get(j); 
        tmp = (byte) (rawByte ^ j); 
        buffer.put(j, tmp); 
        if(null != listener){ 
          listener.onProgress(multiples * CIPHER_BUFFER_LENGHT + j, totalLenght); 
        } 
      } 
      buffer.force(); 
      buffer.clear(); 
      channel.close(); 
      raf.close(); 
      //对加密后的文件重命名,增加.cipher后缀 
//      f.renameTo(new File(f.getPath() + CIPHER_TEXT_SUFFIX)); 
      Log.d("加密用时:", (System.currentTimeMillis() - startTime) /1000 + "s"); 
      return true; 
    } catch (Exception e) { 
      e.printStackTrace(); 
      return false; 
    } 
  } 
   
  public static boolean decrypt(String filePath, CipherListener listener) { 
    try { 
      long startTime = System.currentTimeMillis(); 
      File f = new File(filePath); 
//      if(!f.getPath().toLowerCase().endsWith(CIPHER_TEXT_SUFFIX)){ 
//        //后缀不同,认为是不可解密的密文 
//        return false; 
//      } 
      RandomAccessFile raf = new RandomAccessFile(f, "rw"); 
      long totalLenght = raf.length(); 
      FileChannel channel = raf.getChannel(); 
      long multiples = totalLenght / CIPHER_BUFFER_LENGHT; 
      long remainder = totalLenght % CIPHER_BUFFER_LENGHT; 
      MappedByteBuffer buffer = null; 
      byte tmp; 
      byte rawByte; 
      //先对整除部分解密 
      for(int i = 0; i < multiples; i++){ 
        buffer = channel.map( 
            FileChannel.MapMode.READ_WRITE, i * CIPHER_BUFFER_LENGHT, (i + 1) * CIPHER_BUFFER_LENGHT); 
        //此处的解密方法很简单,只是简单的异或计算 
        for (int j = 0; j < CIPHER_BUFFER_LENGHT; ++j) { 
          rawByte = buffer.get(j); 
          tmp = (byte) (rawByte ^ j); 
          buffer.put(j, tmp); 
          if(null != listener){ 
            listener.onProgress(i * CIPHER_BUFFER_LENGHT + j, totalLenght); 
          } 
        } 
        buffer.force(); 
        buffer.clear(); 
      } 
      //对余数部分解密 
      buffer = channel.map( 
          FileChannel.MapMode.READ_WRITE, multiples * CIPHER_BUFFER_LENGHT, multiples * CIPHER_BUFFER_LENGHT + remainder); 
      for (int j = 0; j < remainder; ++j) { 
        rawByte = buffer.get(j); 
        tmp = (byte) (rawByte ^ j); 
        buffer.put(j, tmp); 
        if(null != listener){ 
          listener.onProgress(multiples * CIPHER_BUFFER_LENGHT + j, totalLenght); 
        } 
      } 
      buffer.force(); 
      buffer.clear(); 
      channel.close(); 
      raf.close(); 
      //对加密后的文件重命名,增加.cipher后缀 
//      f.renameTo(new File(f.getPath().substring(f.getPath().toLowerCase().indexOf(CIPHER_TEXT_SUFFIX)))); 
      Log.d("解密用时:", (System.currentTimeMillis() - startTime) / 1000 + "s"); 
      return true; 
    } catch (Exception e) { 
      e.printStackTrace(); 
      return false; 
    } 
  } 
   
  public interface CipherListener{ 
    void onProgress(long current, long total); 
  } 
} 

效果如图:

代码就是这么多,都有注释。以后再有这种需求可以直接用。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

您可能感兴趣的文章:Android数据加密之Aes加密Android编程加密算法小结(AES、Base64、RAS加密算法)Android AES加密工具类分享Java加密解密工具(适用于JavaSE/JavaEE/Android)Android实现短信加密功能(发送加密短信、解密本地短信)Android 加密解密字符串详解android md5加密与rsa加解密实现代码Android获取apk签名指纹的md5值(防止重新被打包)的实现方法Android编程之MD5加密算法实例分析android中AES加解密的使用方法


--结束END--

本文标题: android中对文件加密解密的实现

本文链接: https://www.lsjlt.com/news/23590.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Springboot实现对配置文件中的明文密码加密详解
    目录前言示例展示原理解析工具介绍实现自定义加解密如何生成密文前言 我们在SpringBoot项目当中,会把数据库的用户名密码等配置直接放在yaml或者properties文件中,这样...
    99+
    2023-03-10
    Springboot配置文件明文密码加密 Springboot明文密码加密 Springboot加密
  • Springboot实现对配置文件中的明文密码加密
    前言 我们在SpringBoot项目当中,会把数据库的用户名密码等配置直接放在yaml或者properties文件中,这样维护数据库的密码等敏感信息显然是有一定风险的,如果相关的配置文件被有心之人拿到,必然会给项目造成一定的安全风险;所以为...
    99+
    2023-09-09
    spring boot mysql spring
  • Springboot如何实现对配置文件中的明文密码加密
    这篇文章主要介绍了Springboot如何实现对配置文件中的明文密码加密的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Springboot如何实现对配置文件中的明文密码加密文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
  • Java如何实现Excel文件加密解密
    本文小编为大家详细介绍“Java如何实现Excel文件加密解密”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java如何实现Excel文件加密解密”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。概述设置excel...
    99+
    2023-06-30
  • java怎么实现rsa加密解密文件
    要在Java中实现RSA加密和解密文件,可以使用Java Cryptography Architecture(JCA)提供的RSA算...
    99+
    2023-10-26
    java
  • android使用AES加密和解密文件实例代码
    前言最近公司需要对本公司的一些下载文件进行加密解密需求,也就尝试去实现下,其实需要借助第三方的jar包:bcprov-jdk15on-155.jar,下载这个可以到网上搜或者下载本人的demo即可,注意:需要加密和解密的key是一致的才可以...
    99+
    2023-05-31
    android aes 加密
  • Java实现文件的加密解密功能示例
    本文实例讲述了Java实现文件的加密解密功能分享给大家供大家参考,具体如下:package com.copy.encrypt;import java.io.File;import java.io.FileInputStream;import...
    99+
    2023-05-31
    java 文件 加密
  • Qt实现解压带有密码的加密文件
    目录1.指定zip压缩包状态2.创建解压文件3.获取实际的压缩数量4.遍历方式创建解压缩文件4.1设置解压文件的参数4.2以读的方式打开加密文件4.3获取当前文件的所有内容4.4创建...
    99+
    2024-04-02
  • Vue中使用crypto-jsAES对称加密算法实现加密解密
    目录 下载crypto-js加密解密数据AES算法的ECB模式加密-设置秘钥AES算法的CBC模式加密-设置秘钥和偏移量参考: 在数字加密算法中,通过可划分为对称...
    99+
    2024-04-02
  • C#实现简单的文件加密与解密方式
    目录C#实现文件加密与解密C#进行url加密解密与jquery前端加密解密C#进行url加密与解密jquery总结C#实现文件加密与解密 代码: static class Handl...
    99+
    2023-01-28
    C#文件加密 C#文件解密 C#文件加密解密方式
  • Java实现Excel文件加密解密的示例代码
    目录概述示例大纲工具Java代码示例示例1加密工作簿示例2解密工作簿示例3加密工作表示例4加密工作表指定数据范围示例5设置工作表公式隐藏示例6解密Excel工作表概述 设置excel...
    99+
    2024-04-02
  • Android怎么加密文件
    在Android设备上,您可以使用以下方法来加密文件:1. 使用应用程序:您可以使用加密文件管理应用程序,例如ES文件资源管理器或Solid Explorer等应用程序。这些应用程序通常提供加密和解密文件的功能。您可以选择要加密的文件,...
    99+
    2023-08-11
    Android
  • SpringBoot配置文件中密码属性加密的实现
    目录背景集成jasypt-spring-boot到项目中配置文件配置加密与读取工作原理简析使用自定义的加密算法结语本文主要介绍了SpringBoot配置文件中的明文密码如何加密保存,...
    99+
    2024-04-02
  • 如何实现bat文件加密和解密脚本
    这篇文章给大家分享的是有关如何实现bat文件加密和解密脚本的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。bat加密脚本(保存为.BAT文件) @echo off cls color 2a :start cls e...
    99+
    2023-06-08
  • c语言中的文件加密与解密
    目录c语言文件加密与解密具体加密过程如下解密过程与加密过程类似,采用的是模26减运算功能要求系统应提供以下功能总结c语言文件加密与解密 本程序是一个c语言的大作业的一部分 是简单的基...
    99+
    2023-05-18
    c语言文件加密 c语言文件解密 c文件加密与解密
  • PHP sm4国密加密解密文件
    phpsm2sm3sm4: php 国密算法 支持 m2 sm3 sm4 SM3WithSM2签名 来源地址:https://blog.csdn.net/licanfeng1/article/details/132236052...
    99+
    2023-09-06
    android android studio ide php
  • C#实现加密exe文件
    目录实践过程效果代码实践过程 效果 代码 public partial class Form1 : Form { public Form1() { ...
    99+
    2023-01-03
    C#加密exe文件 C#加密exe C#加密
  • C语言怎么实现对文件夹加密
    要实现对文件夹加密,可以使用以下步骤: 打开要加密的文件夹,并遍历文件夹中的所有文件和子文件夹。 对每个文件进行加密操作。可以使用...
    99+
    2024-02-29
    C语言
  • python密码学实现文件加密教程
    目录代码输出说明在Python中,可以在传输到通信通道之前加密和解密文件.为此,您必须使用插件 PyCrypto .您可以使用下面给出的命令安装此插件. pip ...
    99+
    2024-04-02
  • 详解Android使用Socket对大文件进行加密传输
    前言数据加密,是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文。它的核心是密码学。数据加密目前仍是计算机系统对信息进行保护的一种最可靠的办法。它利用密码技术对信息进行加密,实现...
    99+
    2023-05-31
    android 文件加密 对大
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作