Python实现基于异或运算的文件加密与解密
本文介绍如何使用Python实现基于异或(XOR)运算的文件加密功能。通过Python的secrets库生成随机密钥,利用异或操作的可逆性对文件内容进行加密和解密。文章详细解析了二进制转换、密钥生成及加解密逻辑,并提供完整的代码示例,帮助开发者掌握简单的文件安全处理技巧。
Python文件加密概述
本文详细讲解如何利用Python实现文件加密功能,文中提供了详细的示例代码,对学习和工作具有参考价值。
在处理重要文件时,加密是常见的安全需求。Python标准库中提供了hashlib、base64等便捷的加密工具。
然而,为了深入理解编程原理,我们可以利用异或(XOR)操作编写一个简单的文件加密程序,以此提升编程技能。
异或运算基础知识
基础知识
在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
上述性质对任意长度的二进制数均成立。
异或加密原理
原理
基于异或运算的性质,加密原理变得直观清晰。
加密流程如下:
首先将文件内容转换为二进制数据,然后生成与该数据等长的随机密钥,最后将二进制数据与密钥进行异或运算,得到加密后的二进制数据。
解密流程如下:
将加密后的二进制数据与原始密钥再次进行异或运算,即可还原出原始二进制数据,最后将其转换回文本文件。
随机密钥生成: Python 3.6引入的secrets库是生成伪随机数的模块,非常适合用于生成加密密钥。token_bytes函数接收一个整数参数,指定生成的随机字节串长度。int.from_bytes函数可将字节串转换为整数,即我们所需的二进制数值。
随机密钥生成实现
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函数接收一个字符串对象,返回包含两个整数的元组(int, int)。首先通过encode方法将字符串编码为字节串,接着使用int.from_bytes函数将其转换为整数对象。最后,将该整数对象与随机生成的密钥进行异或运算,得到加密后的文本数据。
加密与解密核心代码
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函数接收两个整数对象,分别代表加密文本和随机密钥。首先对两者执行异或运算,得到解密后的整数对象。通过decrypted.bit_length函数获取二进制数的位数,除以8得到所占字节数。由于1至7位的二进制数整除8结果为0,因此需先加7再整除8,以确保长度计算正确。最后使用int.to_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参数指定待加密文件的路径。若未指定密钥保存路径(key_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实现文件加密的全部内容,欢迎转发支持。
本文到此结束,希望能为您的学习带来帮助,感谢支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













