rust - 对文件进行zip压缩加密

本文提供了一种对文件进行zip压缩并加密的方法。

生成可见的加密密码

use rand::Rng;const CHARSET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ\
abcdefghijklmnopqrstuvwxyz\
0123456789)(*&^%$#@!~";pub fn random_string(len: usize) -> String {let mut rng = rand::thread_rng();let password: String = (0..len).map(|_| {let idx = rng.gen_range(0..CHARSET.len());CHARSET[idx] as char}).collect();return password;
}

运行一次后得到一个随机密码

random_string(16)

生成不可见的加密密码

为了密码的安全性,可以增加字符的范围。如下生成16个字符的随机密码。

pub fn get_random_key16() -> [u8; 16] {let mut arr = [0u8; 16];rand::thread_rng().try_fill(&mut arr[..]).expect("Ooops!");return arr;
}

压缩文件并加密

use anyhow::Result;
use std::io::Write;
use std::{fs, path::Path};
use zip::unstable::write::FileOptionsExt;
use zip::{write::FileOptions, CompressionMethod, ZipWriter};/// 使用zip格式压缩文件
pub fn zip_file(key: Vec<u8>, src_path: &Path, dst_path: &Path) -> Result<()> {// 创建一个空的zip文件let file = fs::File::create(dst_path).unwrap();// 设置属性支持加密,使用默认压缩等级let mut zip = ZipWriter::new(file);let options = FileOptions::default().compression_method(CompressionMethod::DEFLATE).with_deprecated_encryption(&key);// 添加文件到zip包let src_file_name = src_path.file_name().unwrap();zip.start_file(src_file_name.to_os_string().to_str().unwrap(), options).unwrap();let src_file_content = fs::read(src_path).unwrap();zip.write_all(&src_file_content).unwrap();zip.finish().unwrap();Ok(())
}

单元测试

use std::env;#[test]
fn test_zip_file() {let src_file_path = env::current_dir().unwrap().join("tests/data.txt");let dst_file_path = env::current_dir().unwrap().join("tests/data.zip");let key = get_random_key16();let _ = zip_file(key.to_vec(), &src_file_path, &dst_file_path);
}

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

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

相关文章

仿牛客网开发笔记

01.用到的 一些 核心技术 1 Spring Framework Spring Core IOC 、AOP > 管理对象的一种思想 IOC > 面向对象的管理思想 AOP > 面向切面的管理思想Spring Data Access 》访问数据库的功能 Transaction、Spring MyBatis Transaction 》管理事务Spring MyBat…

人、机中的幻觉和直觉

对于人类而言&#xff0c;幻觉和直觉是两种不同的心理现象。幻觉是一种错误的感知或体验&#xff0c;而直觉是一种在没有明显依据的情况下产生的直观认知。这两种概念在心理学和认知科学中具有不同的意义和研究对象。 人类幻觉是指个体在感知或体验上出现的错误&#xff0c;即看…

wpf的ContentControl的Content属性

我如果非要把其它类型的对象&#xff08;比如字符串&#xff09;强行塞给Content属性呢&#xff1f; 我xmal里没看到content的属性啊? <ContentControl Foreground"Red" FontSize"36" HorizontalAlignment"Center" VerticalAlignment"C…

大型语言模型(LLM):当今最大品牌背后的沉默劳动力

揭秘LLM&#xff1a;语言模型新革命&#xff0c;智能交互的未来趋势 在快节奏的数字时代&#xff0c;大型语言模型&#xff08;LLM&#xff09;已悄然成为许多领先品牌的支柱。 在这篇文章中&#xff0c;我们将深入探讨大型语言模型&#xff08;LLM&#xff09;如何彻底改变行业…

yolov8数据集制作——labelimg

一、为什么我们选择用labelimg标注yolov8数据集 它可以标注三种格式的数据 1 VOC标签格式&#xff0c;保存为xml文件。2 yolo标签格式&#xff0c;保存为txt文件。3 createML标签格式&#xff0c;保存为json格式。二、我们为什么不用labelimg标注yolo数据集 因为它只能标注…

面试算法-107-二叉搜索树迭代器

题目 实现一个二叉搜索树迭代器类BSTIterator &#xff0c;表示一个按中序遍历二叉搜索树&#xff08;BST&#xff09;的迭代器&#xff1a; BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个…

【计算机组成】计算机组成与结构(四)

上一篇&#xff1a;【计算机组成】计算机组成与结构&#xff08;三&#xff09; &#xff08;7&#xff09;存储系统 计算机采用分级存储体系的主要目的是为了解决存储容量、成本和速度之间的矛盾问题。 两级存储:cache-主存、主存-辅存(虚拟存储体系) 局部性原理 ◆ 局部性…

Linux最常用基本指令合集(基本指令,这一篇就够了)

目录 听说点赞的UU会撞大运哦&#xff01;&#xff01;&#xff01; 基本指令&#xff1a; ls指令&#xff1a; cd指令&#xff1a; makdir指令&#xff1a; cat指令&#xff1a; rm指令&#xff1a; mv指令&#xff1a; cp指令&#xff1a; nano指令&#xff1a; m…

初始Java篇(JavaSE基础语法)(4)(数组)(万字详解版)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 目录 数组的创建及初始化 数组的创建 数组的初始化 数组的使用 遍历数组 数组是引用类型 基本类型变量与引用类型变量的区别 引用变量 认识 …

[C++] 类型转换操作符(static_cast、dynamic_cast、const_cast、reinterpret_cast)

说明&#xff1a;本文主要解释static_cast、dynamic_cast、const_cast、reinterpret_cast这几种类型转换操作符。接下来我们对每一个类型转换操作符进行详细说明并给出一些基本的使用方式&#xff0c;重在深入理解。 在解释类型转换操作符之前&#xff0c;我们先了解下&#x…

AI大模型学习在数控系统工艺优化与智能制造中的应用

目录 1.工艺优化&#xff1a; 2.预测维护&#xff1a; 3.质量控制&#xff1a; 4.自动编程&#xff1a; 5.人机协作&#xff1a; 6.系统集成&#xff1a; AI大模型学习在数控系统工艺优化与智能制造中的应用主要体现在以下几个方面&#xff1a; 1.工艺优化&#xff1a; …

Java学习笔记 | Java基础语法 | 03 | 流程控制语句

文章目录 0 前言1.流程控制语句1.1 流程控制语句分类1.2 顺序结构 2.判断语句2.1 if语句1. if语句格式1练习1&#xff1a;老丈人选女婿练习2&#xff1a;考试奖励 2. if语句格式2练习1&#xff1a;吃饭练习2&#xff1a;影院选座 3. if语句格式3练习1&#xff1a;考试奖励 2.2 …

开源表单工作流引擎好用吗?

如果想提升办公协作效率&#xff0c;可以用什么样的平台软件实现&#xff1f;在竞争越来越激烈的社会中&#xff0c;想要实现高效率的办公&#xff0c;可以一起了解低代码技术平台以及开源表单工作流引擎。它们的易操作、灵活、简便等优势特点已成为了中小企业喜爱的优势特点。…

Kubernetes概念:工作负载:工作负载管理:1. Deployments

Deployments 官方文档&#xff1a;https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/ API&#xff1a;https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/workload-resources/deployment-v1/#Deployment 一个 Deployment 为 Pod 和 Repl…

2021保研夏令营面经 天大智算/同济软院/中山软件

天大智算 7月9-12日&#xff08;人太多排了3天&#xff09; 线上 面试 根据问卷里填报的实验室&#xff0c;一个人5分钟PPT&#xff0c;然后老师提问 Q1&#xff1a;你为什么想来天大&#xff1f; Q2&#xff1a;你看待这次夏令营是认真的吗&#xff1f;还是只是一个演练&…

前缀和(三)

题目&#xff1a;激光炸弹 1 链接 P2280 [HNOI2003] 激光炸弹 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 2.大体思路 先开辟一个全局变量的 s 二维数组&#xff0c;这个二维数组开成 s [ 5010 ] [ 5010 ] &#xff0c;这个是为了&#xff0c;能够将它所给的所有有价值的…

linux命令学习——sort

sort可以对文本文件进行“排序”&#xff0c;比如-n可以对文本&#xff0c;按照首行字母数字顺序排序 -r参数可以对排序结果进行反转 -u参数可以对查看结果去重

React - 面试题

1. React函数式组件和类组件的区别 React 中有两种主要的组件类型&#xff1a;函数式组件和类组件。它们之间的区别主要体现在以下几个方面&#xff1a; 语法&#xff1a; 函数式组件&#xff1a;函数式组件是一个简单的 JavaScript 函数&#xff0c;接收 props 作为参数并返回…

笔记—学习【立创】如何使用示波器—捕捉波形

如何使用示波器的信号触发功能 在工程实践中&#xff0c;经常要测量一些不连续的波形。例如&#xff0c;USART、SPI、IIC通讯&#xff0c;只有在通讯时才会产生相应的波形&#xff0c;如果示波器的触发模式没有选择好的话&#xff0c;我们是看不到这个波形的。 切换触发模式 …

CTK插件框架学习-新建插件(02)

CTK插件框架学习-源码下载编译(01)https://mp.csdn.net/mp_blog/creation/editor/136891825 开发环境 window11、vs17、Qt5.14.0、cmake3.27.4 开发流程 新建ctk框架调用工程&#xff08;CTKPlugin&#xff09; 拷贝CTK源码编译完成后的头文件和库文件到工程目录&#xff0…