用Python和 Cryptography库给你的文件加密解密
用Python和 Cryptography库给你的文件加密解密
用Python和 Cryptography库给你的文件加把安全锁。
先介绍与加密解密有关的几个基本概念。
加密(Encryption):加密是将明文转换为密文的过程,使得未经授权的人无法读懂。
解密(Decryption):解密是将密文转换为明文的过程,使得原始信息可以被正确的人阅读。
密钥(Key):密钥是加密和解密过程中的关键。它可以是单个数字、字符串或者是更复杂的密钥对象。
算法:算法是加密和解密过程中的具体步骤。
cryptography是一个强大的Python库,提供了一套丰富的加密相关的操作,用于安全地处理数据。它旨在提供简单易用的加密方法,同时也支持更高级的加密需求,使这项技术变得易于使用。cryptography库包含两个主要的高级组件:Fernet(对称加密)和hazmat(危险材料层)。
主要特点
易用性:cryptography库的设计初衷是易于使用,尽量减少安全漏洞的出现。
安全性:它提供了最新的加密算法,并且经过安全专家的审查。
灵活性:对于需要直接访问加密算法的高级用户,cryptography提供了hazmat模块。
主要组件
Fernet:提供了对称加密的实现,非常适合用于加密和解密可以安全共享密钥的场景。使用Fernet非常简单,只需要一个密钥就可以进行安全的数据加密和解密。
hazmat(Hazardous Materials):这个模块提供了底层加密原语(如块密码、消息摘要算法等)。它是为那些需要执行特定加密操作的高级用户设计的,但使用时需要格外小心,因为不当的使用可能导致安全问题。
官方文档https://cryptography.io/en/latest/
在Windows平台上安装cryptography,可在cmd命令行中,输入如下命令:
pip install cryptography
回车,默认情况使用国外线路较慢,我们可以使用国内的镜像网站:
豆瓣:https://pypi.doubanio.com/simple/
清华:https://pypi.tuna.tsinghua.edu.cn/simple
电脑上安装了多个Python版本,你可以为特定版本的Python安装模块(库、包)。例如我的电脑中安装了多个Python版本,要在Python 3.10版本中安装,并使用清华的镜像,cmd命令行中,输入如下命令
py -3.10 -m pip install cryptography -i https://pypi.tuna.tsinghua.edu.cn/simple
简单示例:使用Fernet进行数据加密和解密源码:
from cryptography.fernet import Fernet# 生成密钥
key = Fernet.generate_key()
cipher_suite = Fernet(key)# 加密数据
data = b"Hello, cryptography!"
encrypted_data = cipher_suite.encrypt(data)
print(f"Encrypted: {encrypted_data}")# 解密数据
decrypted_data = cipher_suite.decrypt(encrypted_data)
print(f"Decrypted: {decrypted_data}")
运行效果:
图形用户界面的文件加密解密程序
使用tkinter添加界面的加密解密程序,当用户点击“加密文件”或“解密文件”按钮时,程序会从这个文本框中获取密钥,并使用它进行相应的加密或解密操作。加密和解密的文件将会被保存在与原文件相同的目录下,加密文件的文件名在原图片文件名前添加enc_,解密文件的文件名在原加密图片文件名前添加dec_
先给出运行效果:
源码如下:
import tkinter as tk
from tkinter import filedialog
from cryptography.fernet import Fernet
import osdef encrypt(filename, key, status_label):try:f = Fernet(key.encode()) # 将密钥从字符串转换为字节with open(filename, "rb") as file:file_data = file.read()encrypted_data = f.encrypt(file_data)dir_name, base_filename = os.path.split(filename)# 分离目录和文件名encrypted_filename = f"enc_{base_filename}"# 将加密文件保存在原始目录中encrypted_file_path = os.path.join(dir_name, encrypted_filename)with open(encrypted_file_path, "wb") as file:file.write(encrypted_data)status_label.config(text=f"提示:文件已加密:{encrypted_filename}")except Exception as e:status_label.config(text=f"提示:加密失败: {str(e)}")def decrypt(filename, key, status_label):try:f = Fernet(key.encode()) # 将密钥从字符串转换为字节with open(filename, "rb") as file:encrypted_data = file.read()decrypted_data = f.decrypt(encrypted_data)# 分离目录和文件名dir_name, base_filename = os.path.split(filename)decrypted_filename = f"dec_{base_filename}"# 将解密文件保存在原始目录中decrypted_file_path = os.path.join(dir_name, decrypted_filename)with open(decrypted_file_path, "wb") as file:file.write(decrypted_data)status_label.config(text=f"提示:文件已解密:{decrypted_filename}")except Exception as e:status_label.config(text=f"提示:解密失败: {str(e)}")# 创建GUI界面
def select_file(operation, key_entry, status_label):key = key_entry.get() # 从文本框获取密钥if not key:status_label.config(text="提示:操作失败:未输入密钥")returnfile_path = filedialog.askopenfilename()if file_path: # 如果file_path不是空字符串if operation == 'encrypt':encrypt(file_path, key, status_label)elif operation == 'decrypt':decrypt(file_path, key, status_label)else:status_label.config(text="提示:没有选择文件")def main():root = tk.Tk()root.title("加密解密程序")tk.Label(root, text="密钥:").pack()key_entry = tk.Entry(root, show='*', width=50) # 密钥输入框key_entry.insert(0, 'X3Q8PvDs2EzKHK-8TjgUE8HkZ8QeuOe0S7-3VVqjTDI=') # 设置默认值 key_entry.pack()status_label = tk.Label(root, text="提示:请选择操作", height=2)status_label.pack()tk.Button(root, text="加密文件", command=lambda: select_file('encrypt', key_entry, status_label)).pack()tk.Button(root, text="解密文件", command=lambda: select_file('decrypt', key_entry, status_label)).pack()root.mainloop()if __name__ == "__main__":main()
cryptography库提供了许多高级功能,提供了多种密码学算法,包括对称加密、非对称加密、哈希函数、签名、密钥管理等等。支持多种加密标准,包括AES、DES、RSA、SSL/TLS等等,同时也提供了许多密码学工具,如密码学随机数生成器、PBKDF2函数、密码学算法器等等。关于这些详情请阅读相关文档,在此仅举以下是一个简单的例子,展示了如何生成RSA密钥对、使用公钥进行加密以及使用私钥进行解密,源码如下:
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes# 生成RSA密钥对
private_key = rsa.generate_private_key(public_exponent=65537,key_size=2048,backend=default_backend()
)
public_key = private_key.public_key()# 将私钥序列化并保存到文件
with open("private_key.pem", "wb") as f:f.write(private_key.private_bytes(encoding=serialization.Encoding.PEM,format=serialization.PrivateFormat.PKCS8,encryption_algorithm=serialization.NoEncryption()))# 将公钥序列化并保存到文件
with open("public_key.pem", "wb") as f:f.write(public_key.public_bytes(encoding=serialization.Encoding.PEM,format=serialization.PublicFormat.SubjectPublicKeyInfo))# 读取公钥进行加密
with open("public_key.pem", "rb") as f:public_key = serialization.load_pem_public_key(f.read(),backend=default_backend())message = "Hello, RSA Cryptography!".encode()
encrypted = public_key.encrypt(message,padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),algorithm=hashes.SHA256(),label=None)
)# 读取私钥进行解密
with open("private_key.pem", "rb") as f:private_key = serialization.load_pem_private_key(f.read(),password=None,backend=default_backend())original_message = private_key.decrypt(encrypted,padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),algorithm=hashes.SHA256(),label=None)
)# 显示解密后的消息
print(original_message.decode())
这个例子首先生成了一个2048位的RSA密钥对,将私钥保存到private_key.pem文件中,将公钥保存到public_key.pem文件中。接下来,代码从public_key.pem文件中读取公钥用于加密消息,从private_key.pem文件中读取私钥用于解密消息。最后,使用公钥对一段消息进行加密,然后使用私钥将消息解密。padding.OAEP是一种常用的填充方式,与SHA-256哈希算法一起使用,以确保加密过程的安全性。
OK!
相关文章:

用Python和 Cryptography库给你的文件加密解密
用Python和 Cryptography库给你的文件加密解密 用Python和 Cryptography库给你的文件加把安全锁。 先介绍与加密解密有关的几个基本概念。 加密(Encryption):加密是将明文转换为密文的过程,使得未经授权的人无法读懂。 解密&a…...

element-ui button 仿写 demo
基于上篇 button 源码分享写了一个简单 demo,在写 demo 的过程中,又发现了一个小细节,分享一下: 1、组件部分: <template><buttonclass"yss-button"click"handleClick":class"[ty…...

Maya------创建多边形工具
配合导入图像使用 Tab键可以删除一个点! 模型不能超过4边面!多切割工具进行连接! 15.maya常用命令5.创建多边形工具 反转 双显 挤出_哔哩哔哩_bilibili...

SQL分组统计条数时,不存在组类型,如何显示条数为0
首先有张表 CREATE TABLE person (id int NOT NULL AUTO_INCREMENT,name varchar(255) DEFAULT NULL,type int DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT2 DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci;表里很简单三条数据: INSERT INT…...
通过日期计算星期函数(C语言版)
测试源代码: #include <stdio.h>int getDayOfWeek(int year, int month, int day) {if (month < 3) {month 12;year--;}int q day;int m month;int K year % 100;int J year / 100;int dayOfWeek (q 13 * (m 1) / 5 K K / 4 J / 4 - 2 * J) % …...

配置支持 OpenAPI 的 ASP.NET Core 应用
写在前面 Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 本文记录如何配置基于Swagger 的 ASP.NET Core 应用程序的 OpenAPI 规范。 需要从NuGet 安装 Swashbuckle.AspNetCore 包 代码实现 var builder WebApplicati…...
前端自己整理的学习面试笔记
简介 以下是本人一年多整理的前端学习笔记,现汇总分享给大家,很多问题都是面试必问的 更多学习资源,可以点击我获取更多 1 js数据类型 原始类型: null undefined number string boolean Symbol BigInt 引用类型: 对…...
jQuery html的使用
jquery中的html方法可以获取和设置标签的html内容 var $div $("div")// 获取标签div的html内容alert($div.html())console.log($div.html()) .html: 设置标签的html内容,之前的内容会清除(只会显示 CSDN) // 设置标签的html内容&…...

锦上添花!特征选择+深度学习:mRMR-CNN-BiGRU-Attention故障识别模型!特征按重要性排序!最大相关最小冗余!
适用平台:Matlab2023版及以上 特征选择方法:"最大相关最小冗余"(Maximal Relevance and Minimal Redundancy,简称MRMR)是一种用于特征选择的方法。该方法旨在找到最相关的特征集,同时最小化特征…...

C++ QT入门2——记事本功能实现与优化(事件处理+基本控件)
C QT入门2——记事本功能优化(事件处理基本控件) 一、记事本功能优化编码乱码问题QComboBox下拉控件QString、string、char * 间的数据转化编码问题解决整合 光标行列值显示记事本打开窗口标题关闭按钮优化—弹窗提示快捷键设计 二、☆ QT事件处理事件处…...

《Lua程序设计》-- 学习10
环境(Environment) 具有动态名称的全局变量 全局变量的声明 由于Lua语言将全局变量存放在一个普通的表中,所以可以通过元表来发现访问不存在全局变量的情况。 正如前面所提到的,我们不允许值为nil的全局变量,因为值为…...

Linux内核编译-ARM
步骤一、下载源码及交叉编译器后解压 linux kernel官网 ARM GCC交叉编译器 步骤二、安装软件 sudo apt-get install ncurses-dev sudo apt-get install flex sudo apt-get install bison sudo apt install libgtk2.0-dev libglib2.0-dev libglade2-dev sudo apt install libs…...

开源编辑器:ONLYOFFICE文档又更新了!
办公软件 ONLYOFFICE文档最新版本 8.0 现已发布:PDF 表单、RTL、单变量求解、图表向导、插件界面设计等更新。 什么是 ONLYOFFICE 文档 ONLYOFFICE 文档是一套功能强大的文档编辑器,支持编辑处理文本文档、电子表格、演示文稿、可填写的表单、PDF&#…...
第3章 文件类型和目录结构
第3章 文件类型和目录结构 在这这章之前我们先学习一个前面使用过的命令 ls 查看文件ls 命令格式: [rootbogon redhat]# ls --helpUsage: ls [OPTION]... [FILE]...List information about the FILEs (the current directory by default).Sort entries alphabeti…...

前端构建变更:从 webpack 换 vite
现状 这里以一个 op (内部运营管理用)项目为例,从 webpack 构建改为 vite 构建,提高本地开发效率,顺便也加深对 webpack 、 vite 的了解。 vite 是前端构建工具,使用 一系列预配置进行rollup 打包&#x…...

记录基于Vue.js的移动端Tree树形组件
目录 一、Liquor Tree 入门 : Development Component Options 组件选项 Structure 结构 二、vue-treeselect Introduction 介绍 Getting Started 入门 Vue 树形选择器( Vue tree select )组件在搭建 Vue 的 app 中特别常用,Vue tree select 除了简单的树形结构…...
Vue中嵌入原生HTML页面的方法
在Vue中嵌入原生HTML页面通常可以通过组件或页面的方式来完成。下面将详细说明如何通过组件方式实现这个功能,并提供一个简单的代码示例。 方法说明 创建原生HTML页面:首先,你需要创建一个原生HTML页面,这个页面可以是一个独立的…...
17 # 类型检查机制:类型保护
例子: enum Type {Strong,Week }class Java {helloJava(){console.log(hello Java);} }class JavaScript {helloJavaScript(){console.log(hello JavaScript);} }function getLanguage(type: Type){let lang type Type.Strong ? new Java() : new JavaScript();…...

Vulnhub-RIPPER: 1渗透
文章目录 一、前言1、靶机ip配置2、渗透目标3、渗透概括 开始实战一、信息获取二、rips的使用三、获取密码文件四、日志审查五、提权 一、前言 由于在做靶机的时候,涉及到的渗透思路是非常的广泛,所以在写文章的时候都是挑重点来写,尽量的不饶…...

幻兽帕鲁自建服务器:可以使用香港服务器吗?
随着网络技术的发展,越来越多的游戏爱好者选择通过自建服务器来享受游戏的乐趣。幻兽帕鲁作为一款备受喜爱的游戏,也有不少玩家想要自建服务器进行游戏。而在选择服务器地点时,很多玩家会想到使用香港服务器。那么,是否可以使用香…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...