cryptography与zlib系列:数据分块解密与解压

cryptography与zlib系列:数据分块解密与解压

数据分块压缩与加密可以查看我的另外一篇博客,这里与之相对应的是解密与解压的操作。解压之后的数据转为BytesIO对象用于后续读取,适用于大部分数据格式,而不需要从文件中读取。

完整示例

from zlib import decompress
from struct import unpack
from concurrent.futures import ThreadPoolExecutor
from io import BytesIOdef decrypt_decompress_chunk(chunk_data, cipher_suite
):# Decrypt the chunkdecrypted_chunk = cipher_suite.decrypt(chunk_data)# Decompress the chunkdecompressed_chunk = decompress(decrypted_chunk)return decompressed_chunkdef get_model_decrypt_decompress_data(file_path: str,cipher_suite=cipher_suite,byteio_flag=True
):# Open the encrypted filewith open(file_path, "rb") as fr:encrypted_chunks = fr.read()# 解析加密块和长度信息chunks = []offset = 0while offset < len(encrypted_chunks):chunk_size = unpack('<I', encrypted_chunks[offset:offset+4])[0]chunk = encrypted_chunks[offset+4:offset+4+chunk_size]chunks.append(chunk)offset += 4 + chunk_size# 创建线程池并解密解压缩with ThreadPoolExecutor(max_workers=len(chunks)) as executor:decompressed_chunks = list(executor.map(lambda x: decrypt_decompress_chunk(x, cipher_suite), chunks))# 合并解压缩数据decompressed_model_data = b''.join(decompressed_chunks)if byteio_flag:decompressed_model_data = BytesIO(decompressed_model_data)# 重置文件指针到开始位置,多线程使用需要使用锁保护decompressed_model_data.seek(0)return decompressed_model_dataif __name__ == "__main__":from time import timefrom cryptography.fernet import Fernetmodel_encrypted_path = "model_test.enc"model_decrypted_path = "model_test.onnx"key =  b''tic = time()cipher_suite = Fernet(key)decompressed_model_data = get_model_decrypt_decompress_data(model_encrypted_path,cipher_suite,)toc = time()print(f"Decompress and decrypt time: {toc - tic:.2f} seconds")tic = time()with open(model_decrypted_path, "wb") as fw:fw.write(decompressed_model_data)toc = time()print(f"Write to file time: {toc - tic:.2f} seconds")

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

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

相关文章

react函数式组件中的路由传参方式

React Router 提供了多种方式来传递路由参数&#xff1a; URL 路径参数&#xff1a;通过动态路由和 useParams 获取。查询参数&#xff1a;通过 useLocation 获取 URL 查询字符串。路由状态传递&#xff1a;通过 state 属性在导航时传递数据&#xff0c;不在 URL 中显示&#…

八股文-基础知识-面试题汇总(一)

面向对象和面向过程的区别&#xff1f; 面向对象和面向过程是两种不同的编程范式&#xff0c;它们在设计和实现软件时有着不同的理念和方法。面向对象更适合大型、复杂的项目&#xff0c;尤其是需要维护和扩展的系统&#xff1b;而面向过程更适合小型、线性的任务或对性能要求…

道品智能科技移动式水肥一体机:农业灌溉施肥的革新之选

在现代农业的发展进程中&#xff0c;科技的力量正日益凸显。其中&#xff0c;移动式水肥一体机以其独特的可移动性、智能化以及实现水肥一体化的卓越性能&#xff0c;成为了农业领域的一颗璀璨新星。它不仅改变了传统的农业灌溉施肥方式&#xff0c;更为农业生产带来了高效、精…

数据结构 (10)队列

前言 队列是一种特殊的数据结构&#xff0c;它遵循先进先出&#xff08;FIFO&#xff0c;First In First Out&#xff09;的原则。 一、定义与基本概念 定义&#xff1a;队列是一种只允许在一端&#xff08;队尾&#xff09;进行插入操作&#xff0c;而在另一端&#xff08;队头…

C#中的异步操作

在 C# 中&#xff0c;异步编程主要是通过 async 和 await 关键字实现的&#xff0c;它们使得异步操作变得更加简洁和易于维护。以下是关于异步线程用法的基本介绍&#xff0c;以及如何编写一个异步函数的步骤和示例。在之前的项目中我其实一直在用这些异步的方法&#xff0c;今…

Python3 WebUI自动化总篇:Python3+Selenium+Pytest+Allure+ Jenkins webUI自动化框架

Python3 WebUI自动化总篇: Python3+Selenium+Pytest+Allure+ Jenkins webUI自动化框架 WebUI接口框架使用的工具

【数据分享】2001-2023年我国30米分辨率冬小麦种植分布栅格数据(免费获取)

小麦、玉米、水稻等各类农作物的种植分布数据在农业、环境、国土等很多专业都经常用到&#xff01; 本次给大家分享的是我国2001-2023年逐年的30米分辨率冬小麦种植分布栅格数据&#xff01;数据格式为TIFF格式&#xff0c;数据坐标为GCS_WGS_1984。该数据包括我国11个省份的冬…

Linux和Ubuntu的关系

Linux和Ubuntu的关系&#xff1a; 1. Linux本身是内核&#xff0c;Ubuntu系统是基于Linux内核的操作系统。 2. Linux内核操作系统的构成&#xff1a; 内核、shell、文件系统、应用程序 -应用程序&#xff1a;文本编辑器等 -文件系统&#xff1a;文件存放在存储设备上的组织方…

17.5k Star,ThingsBoard 一款开源、免费、功能全面的物联网 IoT 平台 -慧知开源充电桩平台

项目介绍 ThingsBoard是一个开源、免费、功能全面、灵活易用的物联网&#xff08;IoT&#xff09;平台&#xff0c;专注于数据收集、处理、可视化以及设备管理。它提供了一个全面的解决方案&#xff0c;用于构建和管理物联网应用。支持从各种设备收集数据&#xff0c;通过内置…

力扣面试150 填充每个节点的下一个右侧节点指针 II BFS 逐层构建法

Problem: 117. 填充每个节点的下一个右侧节点指针 II &#x1f37b; BFS 空间优化 &#x1f469;‍&#x1f3eb; 参考题解 ⏰ 时间复杂度: O ( n ) O(n) O(n)&#x1f30e; 空间复杂度: O ( 1 ) O(1) O(1) class Solution {public Node connect(Node root) {if (root …

Applicaiton配置文件

server:port: 8080 # 配置 Spring Boot 启动端口&#xff0c;默认为 8080mybatis-plus:mapper-locations: classpath:com/xtl/mapper/xml/*.xml # 指定 MyBatis Mapper XML 文件的路径&#xff0c;确保 MyBatis 能够正确加载 Mapper 文件global-config:db-config:id-type: au…

网络安全:攻击和防御练习(全战课), DDos压力测试

XSS 跨站脚本攻击&#xff1a; Cross-site scripting&#xff08;简称xss&#xff09;跨站脚本。 一种网站的安全漏洞的攻击&#xff0c;代码注入攻击的一种。XSS攻击通常指的是通过利用网页开发时留下的漏洞&#xff0c;通过巧妙的方法注入恶意指令代码到网页&#xff0c;使…

文本显示text

文本显示 text是文本组件 创建文本 Text(基础语法)// 引用字符串Text($r(app.string.hella))添加子组件 span能作为Text和RichEditor组件的子组件显示文本内容。 创建span span组建需要写在text组件里面&#xff0c;无法单独使用&#xff0c;可以写多个子组件 Text(可…

ElasticSearch学习篇18_《检索技术核心20讲》LevelDB设计思想

目录 一些常见的设计思想以及基于LSM树的LevelDB是如何利用这些设计思想优化存储、检索效率的。 几种常见的设计思想 索引和数据分离减少磁盘IO读写分离分层思想 LevelDB的设计思想 读写分离设计分层设计与延迟合并LRU缓存加速检索 几种常见设计思想 索引与数据分离 索引…

LabVIEW Real-Time 的特点

LabVIEW Real-Time&#xff08;简称 LabVIEW RT&#xff09;是为实时系统设计的软件平台&#xff0c;结合 NI 硬件&#xff08;如 CompactRIO 和 PXI 系列&#xff09;&#xff0c;能够在高可靠性、高性能要求的场景中实现稳定的实时控制与数据处理。以下是它的主要用处和特点&…

使用脚本实现hadoop-yarn-flink自动化部署

本文使用脚本实现hadoop-yarn-flink的快速部署&#xff08;单机部署&#xff09;。 环境&#xff1a;①操作系统&#xff1a;CentOS 7.6&#xff1b;②CPU&#xff1a;x86&#xff1b;③用户&#xff1a;root。 1.前置条件 把下面的的脚本保存到“pre-install.sh”文件&#x…

【JUC-Interrupt】中断相关概念

线程中断 一、相关概念二、API2.1、isInterrupted方法2.2、interrupted方法2.3、interrupt 三、总结&#xff1a; 一、相关概念 一个线程不应该由其他线程中断或停止&#xff0c;应该有线程自己来决定。 在Java中没有办法立即停止一个线程&#xff0c;因此提供了用于停止线程…

javascript基础学习

什么是伪代码 伪代码(Pseudocode)是一种介于自然语言和编程语言之间的算法描述方式。它使用类似自然语言的语句来描述程序的逻辑和流程,但又采用了编程语言中的一些结构和控制语句,如循环、条件判断等。 伪代码的目的是在不涉及具体编程语言语法细节的情况下,清晰地表达…

Django+Nginx+uwsgi网站Channels+redis+daphne多人在线聊天实现粘贴上传图片

在DjangoNginxuwsgi网站Channelsredisdaphne多人在线的基础上&#xff08;详见DjangoNginxuwsgi网站使用Channelsredisdaphne实现简单的多人在线聊天及消息存储功能-CSDN博客&#xff09;&#xff0c;实现在输入框粘贴或打开本地图片&#xff0c;上传到网站后返回图片路径&…

C++ —— 以真我之名 如飞花般绚丽 - 智能指针

目录 1. RAII和智能指针的设计思路 2. C标准库智能指针的使用 2.1 auto_ptr 2.2 unique_ptr 2.3 简单模拟实现auto_ptr和unique_ptr的核心功能 2.4 shared_ptr 2.4.1 make_shared 2.5 weak_ptr 2.6 shared_ptr的缺陷&#xff1a;循环引用问题 3. shared_ptr 和 unique_…