Python实现基于异或运算的文件加密与解密

Finn
Finn
发布时间:2026-10-13| 5人浏览过
原创

本文介绍如何使用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实现文件加密的全部内容,欢迎转发支持。

本文到此结束,希望能为您的学习带来帮助,感谢支持。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。