基于python实现文件加密功能


Posted in Python onJanuary 06, 2020

这篇文章主要介绍了基于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 相关文章推荐
Python中用于去除空格的三个函数的使用小结
Apr 07 Python
Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】
Jun 20 Python
详解Python里使用正则表达式的ASCII模式
Nov 02 Python
python中实现k-means聚类算法详解
Nov 11 Python
Python实现通讯录功能
Feb 22 Python
python opencv人脸检测提取及保存方法
Aug 03 Python
Python字符串、整数、和浮点型数相互转换实例
Aug 04 Python
Python第三方Window模块文件的几种安装方法
Nov 22 Python
Python multiprocessing多进程原理与应用示例
Feb 28 Python
使用Pyinstaller转换.py文件为.exe可执行程序过程详解
Aug 06 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
Feb 27 Python
python 实现图片修复(可用于去水印)
Nov 19 Python
Pytorch 实现冻结指定卷积层的参数
Jan 06 #Python
如何使用python实现模拟鼠标点击
Jan 06 #Python
pytorch 实现查看网络中的参数
Jan 06 #Python
Python3 虚拟开发环境搭建过程(图文详解)
Jan 06 #Python
Pytorch根据layers的name冻结训练方式
Jan 06 #Python
Windows下python3安装tkinter的问题及解决方法
Jan 06 #Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
Jan 06 #Python
You might like
php checkbox复选框值的获取与checkbox默认值输出方法
2010/05/15 PHP
PHP5.3新特性小结
2016/02/14 PHP
Python中使用django form表单验证的方法
2017/01/16 PHP
实例讲解PHP页面静态化
2018/02/05 PHP
Yii框架函数简单用法分析
2019/09/09 PHP
关于B/S判断浏览器断开的问题讨论
2008/10/29 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
JavaScript 函数惰性载入的实现及其优点介绍
2013/08/12 Javascript
jquery设置元素的readonly和disabled的写法
2013/09/22 Javascript
js控制iframe的高度/宽度让其自适应内容
2014/04/09 Javascript
javascript实现playfair和hill密码算法
2014/12/07 Javascript
JS制作适用于手机和电脑的通知信息效果
2016/10/28 Javascript
AngularJS 限定$scope的范围实例详解
2017/06/23 Javascript
layer.open 按钮的点击事件关闭方法
2018/08/17 Javascript
Vant的安装和配合引入Vue.js项目里的方法步骤
2018/12/05 Javascript
JavaScript箭头函数中的this详解
2019/06/19 Javascript
在vue中使用vant TreeSelect分类选择组件操作
2020/11/02 Javascript
[01:38]女王驾到——至宝魔廷新尊技能&特效展示
2020/06/16 DOTA
在Python中使用正则表达式的方法
2015/08/13 Python
python 实现提取某个索引中某个时间段的数据方法
2019/02/01 Python
使用python实现unix2dos和dos2unix命令的例子
2019/08/13 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
2019/12/11 Python
tensorflow模型保存、加载之变量重命名实例
2020/01/21 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
2020/02/16 Python
Python之字典对象的几种创建方法
2020/09/30 Python
Python函数调用追踪实现代码
2020/11/27 Python
波兰数码相机及配件网上商店: Cyfrowe.pl
2017/06/19 全球购物
英国第一职业高尔夫商店:Clickgolf.co.uk
2020/11/18 全球购物
C语言如何决定使用那种整数类型
2016/11/26 面试题
上海天奕面试题笔试题
2015/04/19 面试题
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的
2015/07/24 面试题
妇产科护士自我鉴定
2013/10/15 职场文书
英语课外活动总结
2014/08/27 职场文书
支部书记四风对照材料
2014/08/28 职场文书
推广普通话主题班会
2015/08/17 职场文书
vue中控制mock在开发环境使用,在生产环境禁用方式
2022/04/06 Vue.js