百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

用 Python 加密文件,技能满满,赶紧get起来

off999 2024-09-23 11:34 90 浏览 0 评论

文:借我一生执拗 源: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私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的Python学习干货,可以送给每一位喜欢Python的小伙伴,想要获取的可以关注我的头条号并在后台私信我:01,即可免费获取。

相关推荐

pe启动工具(pe启动工具排行榜)

u盘pe是可以重复使用的,没有问题的,可以给无数的电脑安装系统。用u盘的做的pe只要不是中病毒,或者你格式化u盘,里面的pe系统一直都是可以用的哈。只是说现在的pe系统最新的更新的技术不一样,...

笔记本电脑按键失灵怎么解决

笔记本电脑按键失灵可能是由于键盘内部灰尘或者物质堵塞,也可能是由于键盘接触不良或者硬件故障导致。修复方法可以尝试清洗键盘或更换键盘,如果还是不行则需要检查硬件或者寻求专业维修人员的帮助。在日常使用中,...

苹果手机imei查询官网(苹果手机imei查询官网免费)

IMEI查询官网:首页:http://www.imeidb.comIMEIdb的客户包括了国内知名手机厂商、IMEIdb始创于2011年IMEIdb是国内唯一的提供面向普通用户和商业用户的IMEI一体...

qq如何修改登录密码(qq怎么修改登录密码)
  • qq如何修改登录密码(qq怎么修改登录密码)
  • qq如何修改登录密码(qq怎么修改登录密码)
  • qq如何修改登录密码(qq怎么修改登录密码)
  • qq如何修改登录密码(qq怎么修改登录密码)
斐讯路由器还能用吗(2021年斐讯路由器还能用吗)

斐讯路由器K2P以上型号的路由器还能用并且还不错。k2p接人个500M左右的网络还可以,K3、K3C更不用说了。斐讯虽然倒闭了,但网络上好多大师给这些路由器续命,适配了不少优秀的路由固件。可以呀,我有...

windows 10下载工具(win10下载软件的工具)

Windows10系统下载软件方法,如果你想使用你的Windows10系统下载软件,那么你可以去你的电脑的应用市场里面,首先下载一个ie的浏览器,这样把你的ie浏览器安装到电脑桌面上面,然后可以在...

个人电子邮箱格式怎么填写(电子邮箱 个人)

很高兴为您解答,电子邮箱的格式通常为:xxx@xx.com。其中xxx为用户名(邮箱帐户名),“@”后面的是域名;如腾讯的邮箱格式一般为:xxxx@qq.com(xxxx为QQ号码)邮箱名加艾特加邮箱...

internet下载地址(internet download manager下载安装版)

下载IE7破解版安装是先验证然后不会通过啊!那样你就把C:\DocumentsandSettings\AllUsers\ApplicationData\WindowsGenuineAdvantage\...

flash官方插件手机版(手机flash插件下载安卓版)

1、下载最新版本的AdobeFlashPlayer的APP到你的Android设备上。2、确保你的浏览器支持Flash,并在你的设备上依次度打开设置>安全勾选上“未知的来源”。3、...

如何启动资源管理器(如何启动资源管理器中的文件)

在Windows中,启动资源管理器有以下三种方法:1.使用快捷键Win+E:这是最常用的方法,按下Windows键和字母"E"键同时,即可快速打开资源管理器。这种方法简便快捷,...

格式化手机储存是什么意思(格式化手机内存是什么)

意思就是把你的内存卡回复出厂设置,卡里面的东西就一并删除了,格式化存储卡也就是把存储卡里的东西全部删掉,不过得注意一些自己有用东西。手机格式化就是恢复出厂设置,删除分区内的所有东西,操作应当慎重。格式...

怎么下载32位版本的qq(qq32位下载手机)

64位系统支持32位系统的软件,而32位系统不支持64位系统软件,现在大多数软件都是按32位开发环境开发的,像QQ这些,如果出64位将会增加成本。如有一天淘汰了32位系统,所有软件就是64位了除去后者...

声卡驱动在哪里打开win11(声卡驱动在那)

要更新Win11的声卡驱动,首先需要打开设备管理器,找到声音、视频和游戏控制器选项,右键点击需要更新的声卡驱动,选择“更新驱动程序”,然后选择“自动搜索更新的驱动程序”,系统会自动搜索并下载最新的驱动...

下载钉钉软件(下载钉钉软件有什么风险)

应用商店下载正版的。可以通过应用商城下载,这里面下载是自动安装的,也可以下载一个浏览器,然后在浏览器中输入钉钉,并点击搜索找到官方网站进行合适的资源下载步步高家教机可以下载安装钉钉下载钉钉要用手机号码...

windows10序列号查看(win10怎样查看序列号)

Win10快速查看序列号的方法:  1、使用电脑快捷键组合“WIN+R”,打开运行窗口。? 2、输入“regedit”,打开注册表编辑器。?  3、打开注册表,路径HKEY_LOCAL_MA...

取消回复欢迎 发表评论: