Android 文件加密解密(AES)

private static final String ALGORITHM = "AES";

=========================文件加密=================================

/*** 文件加密* @param secretKey 文件加密密钥* @param oldFiles 原始文件列表,需要加密的* @param newFiles 构造加密后的文件列表*(选择多个或者单个)多个文件加密*/
@RequiresApi(api = Build.VERSION_CODES.O)
public  void newEncryptFiles(String secretKey, List<File> oldFiles, List<File> newFiles) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException {// 使用密钥字符串生成秘密密钥SecretKey secretKeySpec = new SecretKeySpec(secretKey.getBytes(), ALGORITHM);// 获取 AES 加密算法的实例Cipher cipher = Cipher.getInstance(ALGORITHM);// 使用秘密密钥初始化密码 cipher,设置为加密模式cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);//循环复制文件curr = 1;for (int i = 0; i < oldFiles.size(); i++) {File oldFile = oldFiles.get(i);File newFile = newFiles.get(i);long m = oldFiles.get(i).length();int n = (int)(m/100);int s = 0;//每一份的进度// 创建输入流,读取源文件try (InputStream inputStream = new FileInputStream(oldFile);// 创建输出流,写入加密文件OutputStream outputStream = new FileOutputStream(newFile);// 创建密码输出流,连接到输出流,并使用密码 cipher 进行加密CipherOutputStream cipherOutputStream = new CipherOutputStream(outputStream, cipher)) {// 缓冲区大小byte[] buffer = new byte[4096];int bytesRead;// 读取源文件内容到缓冲区while ((bytesRead = inputStream.read(buffer)) != -1) {// 将加密后的数据写入加密文件cipherOutputStream.write(buffer, 0, bytesRead);s += 1024;if(s >= n){//进度+1handler.sendEmptyMessage(MSG_COPY_RUNNING);prog ++;s = 0;}}}}}

=========================文件解密=========================

SecretKey secretKeySpec = new SecretKeySpec("sin-17214455-@@@".getBytes(), ALGORITHM);
Cipher cipher = null;
try {cipher = Cipher.getInstance(ALGORITHM + "/ECB/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);//获取源加密文件或文件夹路径File  encryptFile= new File(item.getPath() + File.separator +     item.getEncrypted_name());//获取目标解密文件或文件夹路径,解密过后生成的名称original_nameFile newFile = new File(item.getNewPath(), "original_name");// 创建输入流,读取加密文件FileInputStream inputStream = new FileInputStream(encryptFile);// 创建输出流,写入解密文件FileOutputStream outputStream = new FileOutputStream(newFile);// 创建密码输出流,连接到输出流,并使用密码 cipher 进行加密CipherInputStream cipherInputStream = new CipherInputStream(inputStream, cipher);// 缓冲区大小byte[] buffer = new byte[4096];int bytesRead;// 读取源文件内容到缓冲区while ((bytesRead = cipherInputStream.read(buffer)) != -1) {// 将加密后的数据写入解密文件outputStream.write(buffer, 0, bytesRead);}outputStream.close();inputStream.close();cipherInputStream.close();if (!newFile.exists()) {newFile.createNewFile();}if (!newFile.getParentFile().exists()) {newFile.getParentFile().mkdirs();}
  //解密到这里就结束了打开文件,这里就根据自己的需求而定。下面是我自己的一个需求。// 打开文件,调用系统的打开选择的图片,text文件或者其他 FileUtil.openFile(view.getContext(), newFile, ext);
} catch (IOException e) {throw new RuntimeException(e);
} catch (NoSuchFileToOpenException e) {ToastUtil.errorToast(view.getContext(), e.getMessage());throw new RuntimeException(e);
} catch (NoSuchPaddingException e) {throw new RuntimeException(e);
} catch (NoSuchAlgorithmException e) {throw new RuntimeException(e);
} catch (InvalidKeyException e) {throw new RuntimeException(e);
}
/*** 调用系统应用打开文件* @param context context* @param file file对象* @param ext 扩展名()* @throws NoSuchFileToOpenException 没有文件异常*/
public static void openFile(Context context, File file,String ext) throws NoSuchFileToOpenException {if(! file.exists()){throw new NoSuchFileToOpenException("文件不存在");}//根据扩展名,适配相应的typeString type = getType(ext);Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);Uri contentUri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".fileprovider", file);intent.setDataAndType(contentUri,type);} else {Uri uri = Uri.fromFile(file);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.setDataAndType(uri,type);}context.startActivity(intent);
}
/*** 根据扩展名适配打开类型* @param ext 文件扩展名* @return 打开类型*/
public static String getType(String ext) {switch (ext){case "3gp":return "video/3gpp";case "apk":return "application/vnd.android.package-archive";case "asf":return "video/x-ms-asf";case "avi":return "video/x-msvideo";case "bin":return "application/octet-stream";case "bmp":return "image/bmp";case "c":return "text/plain";case "class":return "application/octet-stream";case "conf":return "text/plain";case "cpp":return "text/plain";case "doc":return "application/msword";case "docx":return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";case "xls":return "application/vnd.ms-excel";case "xlsx":return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";case "exe":return "application/octet-stream";case "gif":return "image/gif";case "gtar":return "application/x-gtar";case "gz":return "application/x-gzip";case "h":return "text/plain";case "htm":return "text/html";case "html":return "text/html";case "jar":return "application/java-archive";case "java":return "text/plain";case "jpeg":return "image/jpeg";case "jpg":return "image/jpeg";case "js":return "application/x-javascript";case "log":return "text/plain";case "m3u":return "audio/x-mpegurl";case "m4a":return "audio/mp4a-latm";case "m4b":return "audio/mp4a-latm";case "m4p":return "audio/mp4a-latm";case "m4u":return "video/vnd.mpegurl";case "m4v":return "video/x-m4v";case "mov":return "video/quicktime";case "mp2":return "audio/x-mpeg";case "mp3":return "audio/x-mpeg";case "mp4":return "video/mp4";case "mpc":return "application/vnd.mpohun.certificate";case "mpe":return "video/mpeg";case "mpeg":return "video/mpeg";case "mpg":return "video/mpeg";case "mpg4":return "video/mp4";case "mpga":return "audio/mpeg";case "msg":return "application/vnd.ms-outlook";case "ogg":return "audio/ogg";case "pdf":return "application/pdf";case "png":return "image/png";case "pps":return "application/vnd.ms-powerpoint";case "ppt":return "application/vnd.ms-powerpoint";case "pptx":return "application/vnd.openxmlformats-officedocument.presentationml.presentation";case "prop":return "text/plain";case "rc":return "text/plain";case "rmvb":return "audio/x-pn-realaudio";case "rtf":return "application/rtf";case "sh":return "text/plain";case "tar":return "application/x-tar";case "tgz":return "application/x-compressed";case "txt":return "text/plain";case "wav":return "audio/x-wav";case "wma":return "audio/x-ms-wma";case "wmv":return "audio/x-ms-wmv";case "wps":return "application/vnd.ms-works";case "xml":return "text/plain";case "z":return "application/x-compress";case "zip":return "application/x-zip-compressed";case "":default:return "*/*";}
}

在AndroidManiFest注册fileprovider

<providerandroid:name="androidx.core.content.FileProvider"android:authorities="${applicationId}.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" />
</provider>

在res目录下的xml里面创建files-path

<?xml version="1.0" encoding="utf-8"?>
<paths><files-pathname="files"path="." /><cache-pathname="cache"path="." />
<!--    <external-path-->
<!--        name="external_storage"-->
<!--        path="." />--><external-pathname="file_safe_root_path"path="." /><external-files-pathname="external_files"path="." /><external-cache-pathname="external_cache"path="." /><external-media-pathname="external_media"path="." /><root-pathname="root"path="." /></paths>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/14454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我的文章分类合集目录

文章目录 Java相关基础常规问题类Docker类RabbitMQ类分库分表 网络工程相关路由交换、Cisco Packet TracerIP地址 前端相关数据库 Java相关 基础 Java开发规范、项目开发流程 SpringBoot整合MyBatis实现增删改查(简单,详细) SpringBoot整合MybatisPlus&#xff08;详细&#…

【Muduo】TcpConnection类

Muduo网络库的TcpConnection类代表了TCP连接的一端&#xff0c;即服务器与远程对等端之间的连接。TcpConnection类知道自身和对端的InetAddress、封装了前面讲过的Socket类和Channel类&#xff0c;并且保有管理自己的subLoop指针&#xff0c;还有多种事件处理函数和回调&#x…

【搜索】BFS

#include <iostream> #include <cstring> #include <queue>using namespace std;const int N 110;typedef pair<int, int> PII;int n, m; int g[N][N], d[N][N];//存放地图//存每一个点到起点的距离int bfs() {queue< PII > q;q.push({0, 0});m…

C语言什么是位段?其优点是什么?

一、问题 在内存中&#xff0c;1byte 8bit&#xff0c;即 1 字节等于 8 位。位由两个值组成&#xff0c;即 0 和 1 。因此&#xff0c;存储在计算机中的 1 字节&#xff0c;可以看成是8个⼆进制数字&#xff08;0 和1&#xff09;组成的串。了解了内存空间的最⼩单位&#xff…

16.js数学方法和进制转换

数学方法 &#xff08;1&#xff09;Math.random() 默认生成0-1的随机数 var resMath.random() console.log(res) &#xff08;2&#xff09;Math.round(数字) 取整&#xff1a;正数-四舍五入 负数-5舍6入 var resMath.round(11)console.log(res) //11var res1Math.round(1…

Aerospike设置日志按日期保存及日志保存日期

配置文件位置&#xff1a;/etc/aerospike/aerospike.conf 是Aerospike的主配置文件&#xff0c;其中包含了日志配置以及其他各种设置。 日志配置&#xff1a;在aerospike.conf文件中&#xff0c;找到logging部分进行配置。以下是一个示例配置&#xff1a; logging { # 日志文…

CentOS7安装内网穿透实现远程推送镜像到本地Docker Registry

文章目录 前言1. 部署Docker Registry2. 本地测试推送镜像3. Linux 安装cpolar4. 配置Docker Registry公网访问地址5. 公网远程推送Docker Registry6. 固定Docker Registry公网地址 前言 本文主要介绍如何部署Docker Registry 本地镜像仓库,简单几步结合cpolar内网穿透工具实现…

网络安全之重发布与路由策略详解

重发布&#xff1b;import &#xff08;路由导入&#xff09; 将不同方式&#xff08;直连、静态、缺省、其他协议&#xff09;的路由器重发布进入RIP&#xff0c;OSPF中。 注意&#xff1a;1、华为中不能将缺省路由重发布进入RUO协议&#xff08;思科也是一样&#xff09;。…

Mac下QT开发环境搭建详细教程

QT Qt是一个跨平台的C应用程序框架&#xff0c;用于开发具有图形用户界面&#xff08;GUI&#xff09;的应用程序&#xff0c;同时也可用于开发非GUI程序&#xff0c;比如控制台工具和服务器。Qt是设计成通用、可移植和高效的&#xff0c;它广泛应用于全球的企业和开发者社区中…

青少年 CTF 练习平台:Misc(一)

前言 当然&#xff0c;我可以更详细地介绍一下青少年CTF练习平台。 青少年CTF练习平台是一个专为青少年设计的网络安全竞赛和训练平台。该平台由思而听&#xff08;山东&#xff09;网络科技有限公司与克拉玛依市思而听网络科技有限公司共同建设&#xff0c;自2018年创建以来…

图论定理汇总(二)

第六章 平面图 (一)、平面图的概念 定义1 如果能把图 G G G画在平面上&#xff0c;使得除顶点外&#xff0c;边与边之间没有交叉&#xff0c;称 G G G可嵌入平面&#xff0c;或称 G G G是可平面图。可平面图 G G G的边不交叉的一种画法&#xff0c;称为 G G G的一种平面嵌入&…

入门四认识HTML

一、HTML介绍 1、Web前端三大核心技术 HTML&#xff1a;负责网页的架构 CSS&#xff1a;负责网页的样式、美化 JS&#xff1a;负责网页的行动 2、什么是HTML HTML是用来描述网页的一种语言。 3、Html标签 单标签<html> 双标签<h>内容</h> 4、标…

spring boot整合j2cache 关闭二级缓存

我们整合了 j2cache 的项目启动 日志会输出 一级缓存 二级缓存 一级是 EhCacheProvider 二级是 SpringRedisProvider 如果 我们不想用二级缓存 在 j2cache.properties 中 加上 j2cache.12-cache-open配置 值为 true/false true是启用二级缓存 false 是不起用 默认 true 所以 …

多输入多输出 | Matlab实现GA-CNN遗传算法优化卷积神经网络多输入多输出预测

多输入多输出 | Matlab实现GA-CNN遗传算法优化卷积神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现GA-CNN遗传算法优化卷积神经网络多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现GA-CNN遗传算法优化卷积神经网络多输入多输出预测&…

微服务技术框架-注册中心-负载均衡

应用层的负载均衡可以选择依赖注册中心&#xff0c;也可以不依赖注册中心。以下是两种情况的详细说明&#xff1a; 1. 不依赖注册中心的负载均衡 在没有注册中心的情况下&#xff0c;应用层负载均衡可以通过配置静态服务器列表或动态检测服务器健康状态来实现。以下是一些常见…

企业防泄密软件有哪些,哪个排名最好

机密数据的泄密对于企业而言&#xff0c;已成为最大的信息安全威胁之一。近年来企业面对的最大威胁来自于内部&#xff0c;以利益为出发点的互联网信息犯罪及案件&#xff0c;在世界各地不断传出&#xff0c;因此&#xff0c;信息保护与管控将逐渐成为企业信息安全重点部署项目…

VMware 安装Windows 7 SP1

1.下载镜像 迅雷&#xff1a;ed2k://|file|cn_windows_7_enterprise_with_sp1_x64_dvd_u_677685.iso|3265574912|E9DB2607EA3B3540F3FE2E388F8C53C4|/ 2.安装过程 自定义名字&#xff0c;点击【浏览】自定义安装路径 点击【浏览】&#xff0c;选择下载镜像的路径 结束啦~

html+css绘制自定义样式输入框

效果&#xff1a; 代码&#xff1a; html部分&#xff1a; <div class"box"> <div class"newbox"><input type"text" required><div class"name">Username</div></div> </div>css部分 …

投骰子——(随机游戏的控制)

精华点在于&#xff1a;利用封装&#xff0c;函数之间的良好调用&#xff0c;从而清晰明了的解决问题。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> # include<stdlib.h> # include<time.h> # include"math.h" # define ARR_LEN 10 # d…

hpc中查看显存占用,等效nvidia-smi

nvidia-smi在hpc中无法使用&#xff0c; 但是可以通过以下方法查看应用程序占用的显存 先执行程序&#xff0c;之后 bjobs输出 可以看到使用的是gpu01节点 之后 ssh gpu01