生活中,有时候我们需要对一些重要的文件进行加密,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
from typing import Tupledef random_key(length:int) -> int:key:bytes = token_bytes(nbytes=length)key_int:int = int.from_bytes(key, 'big')return key_int

加密单元:

encrypt 函数接受一个 str 对象,返回元组 (int, int)。通过 encode 方法,我们将字符串编码成字节串。int.from_bytes 函数将字节串转换为 int 对象。最后对二进制对象和随机密钥进行异或操作,就得到了加密文本。

def encrypt(raw:str) -> Tuple[int, int]:raw_bytes:bytes = raw.encode()raw_int:int = int.from_bytes(raw_bytes, 'big')key_int: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:int, key_int:int) -> str:decrypted:int = encrypted ^ key_intlength = (decrypted.bit_length() + 7) // 8decrypted_bytes: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 Pathdef encrypt_file(path:str, 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:str, 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.namepath_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文本加密 或 文本文件加密相关推荐

  1. windows中使用Python进行AES加密解密-文本文件加密工具

    之前的文章http://blog.csdn.net/u013578500/article/details/77905924 简单介绍了一下使用PyCrypto模块实现对字符串的加密解密,里面有提到我利 ...

  2. 文本文件加密和解密_解密文本见解和相关业务用例

    文本文件加密和解密 The objective is to provide crisp information about possibilities in Text analytics and ho ...

  3. hashlib —— Python 的 md5 和 sha1 加密

    python的md5和sha1加密 0. md5 与 sha1 MD5 的全称是 Message-Digest Algorithm 5(信息-摘要算法).128 位长度.目前 MD5 是一种不可逆算法 ...

  4. html代码的魔方加密,三维魔方加密算法如何给文本文件加密

    三维魔方加密算法因其运算速度快.密钥空间大被广泛应用.那么我们今天就来看看三维魔方加密算法是如何给文本文件加密的? 一.三维魔方加密算法原理 三维模仿加密算法的思路来源于魔方,是基于一个立方体来作加密 ...

  5. python rsa加密解密_RSA加密解密(python版)

    RSA的算法涉及三个参数,n.e.d. 其中,n是两个大质数p.q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度. e1和d是一对相关的值,e可以任意取,但要求e与(p-1)*(q-1)互质: ...

  6. 基于Python语言、RSA非对称加密的IRC聊天室客户端

    源码地址: (55条消息) 基于Python语言.RSA非对称加密的IRC聊天室客户端源码与应用程序-Python文档类资源-CSDN文库 1 研究背景和现状 IRC是Internet Relay C ...

  7. python可逆加密算法_常见加密方式及Python实现

    由于计算机软件的非法复制,通信的泄密.数据安全受到威胁,所以加密在开发过程中是经常使用到的技术,在一些重要场景中都有所应用,如:登录.支付.oauth等,场景不同需要搭配不一样的签名加密算法来达到业务 ...

  8. python rsa库_python RSA加密解密

    RSA加密(pip install pycryptodome) 总结: Pycrypto提供了比较完善的加密算法.RSA广泛用于加密与解密,还有数字签名通信领域.使用Publick/Private秘钥 ...

  9. python发送qq邮件(加密非加密)

    python发送qq邮件,加密发送,非加密发送 设置qq邮箱 设置开启客户端功能 设置--->账户 开启POP3/SMTP服务 根据提示开启 授权码 开启成功 查看qq邮件服务器信息1 查看qq ...

  10. 基于python的文件加密传输系统 毕业论文_20183411 李丞灏 2020-2021 《python程序设计》 实验三 加密传输文件 实验报告...

    20183411 李丞灏 2020-2021 <python程序设计> 实验三 加密传输文件 实验报告 课程:<Python程序设计> 班级: 1834 姓名: 李丞灏 学号: ...

最新文章

  1. 深入理解PHP之数组遍历
  2. mysql命令行的光标不显示和git-bash不能直接使用mysql登录的问题
  3. Springboot@Configuration和@Bean详解
  4. Java 8系列之重构和定制收集器
  5. ssm实现发送邮件功能
  6. 进程互斥的要求与实现方法
  7. 【最佳解法】剑指 Offer 32 - III. 从上到下打印二叉树 III
  8. 如何生成 jMeter 结果分析统计图表
  9. jquery ui autocomplete输入中文不自动完成的问题
  10. .NET可逆框架设计
  11. 回购价低于股价怎么办?
  12. Python 表白?别傻了,女神是拿来撩的!
  13. 20200126:(leetcode)三数之和 最接近的三数之和(含图解)
  14. CSS样式的简单使用
  15. vue微信扫码登录过程
  16. 怎么样锁定计算机时间,电脑屏幕锁屏设置时间还是锁不了怎么办
  17. haozi/xss-demo通关
  18. 聚焦化工安全:化工厂人员定位
  19. 竞价网站服务器,派代网-竞价网站被攻击的完美解决方法
  20. 深入了解宽带路由器共享上网原理

热门文章

  1. 虚拟机VMware安装ubuntu教程
  2. 使用Python+百度AI把文字转成语音
  3. Detours Hook初探
  4. 计算机科学与技术专业毕业答辨问题,计算机科学与技术毕业论文题目参考
  5. 蓝牙音箱项目:记录CSR8635芯片的蓝牙音箱的开发过程
  6. 短信发送接口超详细短信接口使用教程
  7. 【软件测试岗面经分享】华为测试工程师面经,已成功上岸
  8. 高淇java_关于高淇JAVA中SORM总结学习笔记详细个人解释
  9. java 高淇讲的怎么样_反射机制--高淇Java视频笔记
  10. 数据库sql优化总结之1-百万级数据库优化方案+案例分析