用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)
解密文件
- #Python学习群592539176
- 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实现文件加密
前言: 想实现批量文件加密,可惜批量.展时没有思路 0x1 没有加密前的图片 加密后!!! !!!打不开了 0x02: 代码 import hashlib def get_sha1(f): xd=op ...
- python实现文件查找功能,excel写入功能
因为要丛UE文档中过滤关键字来统计解码时间,第一次自己完成了一个自动化统计的小工具,用起来颇有成就感. UE文件的内如如下: 需要丛这份关键字中过滤红色标记的两个关键字,取 一个关键字的最后一位,和取 ...
- Python实现文件阅读功能(Python学习笔记)
#!/usr/bin/python# Filename: filereader.pyimport sys def readfile(filename): '''Print a file to the ...
- python实现更换电脑桌面壁纸,锁屏,文件加密方式
python实现更换壁纸和锁屏代码 #控制windows系统 import win32api,win32con,win32gui # 可以利用python去调用dll动态库的包.嵌入式开发 from ...
- python保留指定文件、删除目录其他文件的功能(1)
由于给客户的发布版本上客户改动了些代码和图片,我们这边给他们更新publish都是增量更新(开发提供更新指定的文件,我们提取出来给客户进行覆盖更新),但有时需要更新的文件较多导致不得不一个一个的进行查 ...
- Windows对python文件加密
最近项目需要对部分python文件加密,调研了部分方法都觉得不可行,最后采用了将python转换成so文件.pyd文件的方法.so文件,为liunx下的动态链接库文件,在windows下为dll文件, ...
- python保留指定文件、删除目录其他文件的功能(2)
在(1)中脚本实现了保留指定文件的功能,但不能删除空目录,在此补上删除空目录的方法 def DeleteEmptyDir(path): for i in range(1,100): for paren ...
- Python之文件与目录操作及压缩模块(os、shutil、zipfile、tarfile)
Python中可以用于对文件和目录进行操作的内置模块包括: 模块/函数名称 功能描述 open()函数 文件读取或写入 os.path模块 文件路径操作 os模块 文件和目录简单操作 zipfile模 ...
- 【转】Python之文件与目录操作(os、zipfile、tarfile、shutil)
[转]Python之文件与目录操作(os.zipfile.tarfile.shutil) Python中可以用于对文件和目录进行操作的内置模块包括: 模块/函数名称 功能描述 open()函数 文件读 ...
随机推荐
- 04-Java基础语法【IDEA、方法】
重要内容记录: 01.IDE介绍 IDE(Integarted Development Environment)是Java集成开发环境,是一种专门用来提高Java开发效率的软件. 免费的IDE:Ecl ...
- Ueditor百度编辑器中 setContent()方法的使用
百度编辑器Ueditor所提供的setContent()方法作用是:设置或者改变编辑器里面的文字内容或html内容 函数说明:setContent(string,boolean); 参数string ...
- NW.js桌面应用开发(一)
NWjs中文网 Electron中文网 一些需要了解的历史与特性,其实就是 NW.js 和 Electron的争议,建议还是亲自阅读一下各自的官网说明 1.下载SDK版工具 从淘宝NPM镜像下载,速度 ...
- 给html元素添加自定义属性,并且用jquery进行筛选
例如有多个div,想要实现类似radio的效果. <div name="teacher" selected="selected">tch1</ ...
- String.valueOf()和toString()的区别
1.String.valueOf(): Object obj=null; String str=""; str=String.valueOf(obj); //str=obj.toS ...
- input:file上传文件类型(记录)
imput 属性有以下几种: 1.type:input类型这就不多说了2.accept:表示可以选择的文件类型,多个类型用英文逗号分开,常用的类型见下表. <input id="fil ...
- 屏蔽tips
在屏蔽的地方打上记号,这样解屏蔽时就容易找到屏蔽的地方了
- pikaqiu练习平台(XSS(跨站脚本))
XSS(跨站脚本)概述 Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS.一般XSS可以分为如下几种常见类型: ...
- 常用bat脚本整理
在当前文件夹下 shift +鼠标右键 打开终端 输入 tree /f > 1.txt 则将文件夹下的文件名放入1.txt文件中.不包含绝对路径. 要么是写个.bat文件,文件内容为 dir ...
- [lua]紫猫lua教程-命令宝典-L1-01-10. 自定义函数
L1[function]01. 定义与调用函数 函数的定义 和概念 没什么可说的 lua的函数声明和调用是有先后顺序的 先声明后调用 函数就是变量的一种 所以可以自由的把函数在变量间相互赋值 不过注 ...