python怎样打开加密的文件_如何用Python 加密文件
生活中,有时候我们需要对一些重要的文件进行加密,Python 提供了诸如 hashlib,base64 等便于使用的加密库。
但对于日常学习而言,我们可以借助异或操作,实现一个简单的文件加密程序,从而强化自身的编程能力。
基础知识
在 Python 中异或操作符为:^,也可以记作 XOR。按位异或的意思是:相同值异或为 0,不同值异或为 1。具体来讲,有四种可能:0 ^ 0 = 0,0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0。我们还可总结出规律(A 为 0 或 1):0 和 A 异或为 A本身;1 和 A 异或为 A 反。
让我们想看看一位二进制数满足的性质:
一位二进制数与自身的异或值为 0
b ^ b = 0
异或操作满足交换律
a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c
0 与 a 的异或为 a
(a ^ b) ^ b = a ^ (b ^ b) = a ^ 0 = a
易知,对任意长二进制数都满足上述性质。
原理
通过了解异或操作的性质,加密原理就非常清晰了。
加密操作:
首先将文件转换成二进制数,再生成与该二进制数等长的随机密钥,将二进制数与密钥进行异或操作,得到加密后的二进制数。
解密操作:
将加密后的二进制程序与密钥进行异或操作,就得到原二进制数,最后将原二进制数恢复成文本文件。
生成随机密钥:
secrets 库是 Python 3.6 引入的伪随机数模块,适合生成随机密钥。token_bytes 函数接受一个 int 参数,用于指定随机字节串的长度。int.from_bytes 把字节串转换为 int,也就是我们需要的二进制数。
from secrets import token_bytes
def random_key(length):
key = token_bytes(nbytes=length)
key_int = int.from_bytes(key, 'big')
return key_int
加密单元:
encrypt 函数接受一个 str 对象,返回元组 (int, int)。通过 encode 方法,我们将字符串编码成字节串。int.from_bytes 函数将字节串转换为 int 对象。最后对二进制对象和随机密钥进行异或操作,就得到了加密文本。
def encrypt(raw):
raw_bytes = raw.encode()
raw_int = int.from_bytes(raw_bytes, 'big')
key_int = random_key(len(raw_bytes))
return raw_int ^ key_int, key_int
解密单元:
decrypt 接受两个 int 对象,分别为加密文本和随机密钥。首先对两者进行异或操作,计算解密出来的 int 对象所占比特数。decrypted.bit_length 函数得到的是二进制数的位数,除以 8 可以得到所占比特大小。为了防止,1 ~ 7 位的二进制数整除 8 得到 0,所以要加上 7,然后再进行整除 8 的操作。使用 int.to_bytes 函数将解密之后的 int 的对象转换成 bytes 对象。最后通过 decode 方法,将字节串转换成字符串。
def decrypt(encrypted, key_int):
decrypted = encrypted ^ key_int
length = (decrypted.bit_length() + 7) // 8
decrypted_bytes = int.to_bytes(decrypted, length, 'big')
return decrypted_bytes.decode()
利用上述函数,我们可以很轻松对文本文件进行加密、解密操作。
>>> raw = '画图省识春风面,环珮空归夜月魂'
>>> encrypted = encrypt(raw)
>>> encrypted
(217447100157746604585...,
9697901906831571319...)
>>> decrypt(*encrypted)
'画图省识春风面,环珮空归夜月魂'
加密文本文件
path 为待加密文件的地址,如果不指定密钥地址,则在该目录下新建目录和文件。
import json
from pathlib import Path
def encrypt_file(path, key_path=None, *, encoding='utf-8'):
path = Path(path)
cwd = path.cwd() / path.name.split('.')[0]
path_encrypted = cwd / path.name
if key_path is None:
key_path = cwd / 'key'
if not cwd.exists():
cwd.mkdir()
path_encrypted.touch()
key_path.touch()
with path.open('rt', encoding=encoding) as f1, \
path_encrypted.open('wt', encoding=encoding) as f2, \
key_path.open('wt', encoding=encoding) as f3:
encrypted, key = encrypt(f1.read())
json.dump(encrypted, f2)
json.dump(key, f3)
解密文件
def decrypt_file(path_encrypted, key_path=None, *, encoding='utf-8'):
path_encrypted = Path(path_encrypted)
cwd = path_encrypted.cwd()
path_decrypted = cwd / 'decrypted'
if not path_decrypted.exists():
path_decrypted.mkdir()
path_decrypted /= path_encrypted.name
path_decrypted.touch()
if key_path is None:
key_path = cwd / 'key'
with path_encrypted.open('rt', encoding=encoding) as f1, \
key_path.open('rt', encoding=encoding) as f2, \
path_decrypted.open('wt', encoding=encoding) as f3:
decrypted = decrypt(json.load(f1), json.load(f2))
f3.write(decrypted)
执行完加密、解密文件操作,得到的解密文件与原文件相同,示意图如下:
以上就是如何用Python 加密文件的详细内容,更多关于Python 加密文件的资料请关注我们其它相关文章!
本文标题: 如何用Python 加密文件
本文地址: http://www.cppcns.com/jiaoben/python/343956.html
python怎样打开加密的文件_如何用Python 加密文件相关推荐
- python 批量读取xlsx并合并_如何用Python快速导入多个excel文件并合并文件数据
日常工作中,每个月都会遇到那么个固定的工作,将业务方同事整理的数据导入GP数据库中的某张表中:听起来是很简单的活呢! 但每次业务MM总会发来一个文件夹,里面有三四十个Excel文件(.xlsx格式,且 ...
- python 资源文件_如何用 Python 正确读取资源文件
但这样写稍显麻烦. 如果你的 Python 版本不低于3.7,那么你可以使用importlib.resources来快速读取资源文件: from importlib import resources ...
- python查找文件夹下所有文件_如何用Python实现查找/目录下的文件夹或文件,致谢...
给你各相对来说容易理解的哈 import os name=raw_input('filename:') #在这里输入你的查找值 a=os.listdir('/') #把所有/目录下的文件,目录存放入a ...
- python词云有什么用_如何用Python实现词云效果
如何用Python实现词云效果 发布时间:2020-06-06 10:56:57 来源:亿速云 阅读:204 作者:Leah 这篇文章主要为大家详细介绍了用Python实现词云效果的方法,图文详解容易 ...
- python在工作中怎么用_如何用python在工作中“偷懒”
原标题:如何用python在工作中"偷懒" "偷懒还能干完活,才是本事 " 有些朋友在工作中会有这样的困惑:明明我从早忙到晚,为什么得到的评价还不高? 要知道, ...
- python如何让图片镜像翻转_如何用 Python 增量备份 Roam Research 笔记图片?
消除后顾之忧,轻松输入卡片笔记. 题图:Photo by Markus Spiske on Unsplash 前些日子,我用视频的方式给你介绍了 Roam Research 这款工具.如果你还没有来得 ...
- 用python做一个舆情分析系统_如何用Python做舆情时间序列可视化?
如何批量处理评论信息情感分析,并且在时间轴上可视化呈现?舆情分析并不难,让我们用Python来实现它吧. 痛点 你是一家连锁火锅店的区域经理,很注重顾客对餐厅的评价.从前,你苦恼的是顾客不爱写评价.最 ...
- python生僻字如何转码_如何用Python检测生僻字
最近在工作中碰到一个需求,要求检测字段是否包含生僻字以及一些非法字符如 ~!@#$%^&*.通过网上的查找资料解决了,现在将解决的过程和示例代码分享给大家,有需要的可以参考借鉴.下面来一起看看 ...
- python怎么实现音乐快进_如何用PYTHON代码写出音乐【】
如何制作MIDI(用于vocaloid 3) 我也是因为V家才来找midi的 如何用PYTHON代码写出音乐 在python-midi,每个乐谱用Pattern对象表示,乐的每个音轨(通常音乐很多轨道 ...
最新文章
- 7.Mongodb复制(副本集)
- TensorRT学习笔记7 - 保存与读取序列化的结果
- hdu 4966 最小树形图
- java media player_MediaPlayerForJava(创建一个视频播放器)
- ajax child,如何在ajax上使用this.children
- 基于深度学习的文本分类2
- 企业数据云公司Cloudera发布CDP私有云,完善整套企业数据云愿景
- 我们每天努力上班赚钱,财富离我们很远
- 阿里每天纳税超 1.4 亿元;余承东:苹果很难和华为竞争;三星 Note 7 爆炸案终审 | 极客头条...
- 语音识别相关书籍抖音十大先看哪一本最好
- linux ldconfig 刷新动态库,linux下动态共享库的创建,使用与更新(包括ldconfig的使用)g++ -WI -soname...
- 飞天诚信ROCKEY-ARM(标准锁)软件加密狗使用记录
- 在Linux下安装QQ
- python实现货币贷款分期计算(等额本金/等额本息)
- Echarts制作动态K线图和分时图
- 计算机专业英语四六级,英语四级历年真题,历年四六级真题电子版?
- React学习笔记之三(关于setState的若干问题及其讨论)
- win10驱动开发16——派遣函数(直接方式读操作)
- 【笔记】《iOS开发进阶-唐巧》
- 付费入群怎么做_微信群怎么设置付费才可以进入
热门文章
- 一步步创建ABAP post exit增强
- JSP项目报错在build path里找不到javax.servlet.http.HttpServlet的解决方法
- SAP Analytics Cloud关于Smart Predict功能的说明
- SAP CRM WebClient UI data loss设计原理
- 使用cf curl查看SAP云平台上的应用各项明细
- SAP Hybris里搜索显示结果的实现原理
- how does SAP ui5 know the phone, tablet type, os type
- 快速找到message toast弹出的application代码位置
- 如何处理SAP Launchpad上tile打不开的问题
- IBASE read hierarchy