基于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 相关文章推荐
centos下更新Python版本的步骤
Feb 12 Python
分析Python编程时利用wxPython来支持多线程的方法
Apr 07 Python
python实现从网络下载文件并获得文件大小及类型的方法
Apr 28 Python
python使用Image处理图片常用技巧分析
Jun 01 Python
Python函数式编程指南(二):从函数开始
Jun 24 Python
Python下Fabric的简单部署方法
Jul 14 Python
Python实现多线程抓取网页功能实例详解
Jun 08 Python
python3获取当前文件的上一级目录实例
Apr 26 Python
Ubuntu中配置TensorFlow使用环境的方法
Apr 21 Python
python安装及变量名介绍详解
Dec 12 Python
Pycharm在指定目录下生成文件和删除文件的实现
Dec 28 Python
python 使用OpenCV进行简单的人像分割与合成
Feb 02 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
数据库相关问题
2006/10/09 PHP
PHP时间类完整实例(非常实用)
2015/12/25 PHP
大家须知简单的php性能优化注意点
2016/01/04 PHP
php blowfish加密解密算法
2016/07/02 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
Laravel框架实现超简单的分页效果示例
2019/02/08 PHP
javascript之解决IE下不渲染的bug
2007/06/29 Javascript
JavaScript 变量基础知识
2009/11/07 Javascript
EXT中xtype的含义分析
2010/01/07 Javascript
javascript 10进制和62进制的相互转换
2014/07/31 Javascript
jQuery扁平化风格下拉框美化插件FancySelect使用指南
2015/02/10 Javascript
jquery实现横向图片轮播特效代码分享
2015/11/19 Javascript
vuex提交state&&实时监听state数据的改变方法
2018/09/16 Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
2019/04/28 Javascript
WebSocket的简单介绍及应用
2019/05/23 Javascript
微信小程序日历插件代码实例
2019/12/04 Javascript
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
2019/12/17 Javascript
python3+mysql查询数据并通过邮件群发excel附件
2018/02/24 Python
python+gdal+遥感图像拼接(mosaic)的实例
2020/03/10 Python
Python正则表达式高级使用方法汇总
2020/06/18 Python
Python如何实现机器人聊天
2020/09/10 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
2020/12/18 Python
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
俄罗斯品牌服装和鞋子在线商店:BRIONITY
2020/03/26 全球购物
常用UNIX 命令(Linux的常用命令)
2013/07/10 面试题
2014年中班元旦活动方案
2014/02/14 职场文书
爱之链教学反思
2014/04/30 职场文书
优秀研究生主要事迹
2014/06/03 职场文书
大学同学会活动方案
2014/08/20 职场文书
党员教师批评与自我批评发言稿
2014/10/15 职场文书
投标承诺函格式
2015/01/21 职场文书
2015年英语教研组工作总结
2015/05/23 职场文书
关于五一放假的通知
2015/08/18 职场文书
Python IO文件管理的具体使用
2022/03/20 Python
《月歌。》宣布制作10周年纪念剧场版《RABBITS KINGDOM THE MOVIE》
2022/04/02 日漫