python编写加密程序_用Python实现一个简单的加密程序

生活中,有时候我们需要对一些重要的文件进行加密,Python 提供了诸如 hashlib,base64 等便于使用的加密库。

对于日常学习而言,我们可以借助异或操作,实现一个简单的文件加密程序,从而强化自身的编程能力。

关注微信公众号:Python高效编程,了解更多

基础知识

在 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) ^ c0 与 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 Tuple

def 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_int

length = (decrypted.bit_length() + 7) // 8

decrypted_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 Path

def 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.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高效编程,后台回复 2019517,即可获取源代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里巴巴开源容器镜像加速技术

简介: 近日阿里巴巴开源了其云原生容器镜像加速技术,其推出的overlaybd镜像格式,相比于传统的分层tar包文件格式,实现了基于网络的按需读取,从而使得容器可以快速启动。 近日阿里巴巴开源了其云原生容器镜像加速技术&…

Unity重写Inspector简化分组配置文件

Unity重写Inspector简化分组配置文件 重写Inspector创建分组管理配置文件创建修改参数参数对应类工程在我的资源中名为CreateConfig,免费下载 重写Inspector创建分组管理配置文件 创建 修改参数 参数对应类 using UnityEngine;public class GameConfig : Scriptab…

985大学的高材生只会写代码片段,丢人吗?

很多同学在学习编程的时候都会遇到各种各样的难题,比如:没有合适的资料、学习过于碎片化、资料的质量层次不齐、看了很多视频自己动手时却还是不会、接触不到完整项目、无法检测自己的编程水平是不是企业所认可的……最近,小郭和小解同学也遇…

python 生成器_Python生成器中的GeneratorExit

我写了一个关于Python生成器的测试程序.但是我得到了一个不期望的错误.我不知道如何解释它.我来告诉你代码: def countdown(n): logging.debug("Counting down") while n > 0: try: yield n except GeneratorExit: logging.error("GeneratorExit&…

快手基于RocketMQ的在线消息系统建设实践

简介: 快手需要建设一个主要面向在线业务的消息系统作为 Kafka 的补充,低延迟、高并发、高可用、高可靠的分布式消息中间件 RocketMQ 正是我们所需的。 作者:黄理 黄理,10多年软件开发和架构经验,热衷于代码和性能优…

基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台

简介: 本文将对 RocketMQ-Exporter 的设计实现做一个简单的介绍,读者可通过本文了解到 RocketMQ-Exporter 的实现过程,以及通过 RocketMQ-Exporter 来搭建自己的 RocketMQ 监控系统。RocketMQ 在线可交互教程现已登录知行动手实验室&#xff…

c语言结构体函数平面向量加法公式,插值 拟合 符号变量与符号表达式 微积分 解方程 向量运算...

7.1.1 分段线性插值所谓分段线性插值就是通过插值点用折线段连接起来逼近原曲线,这也是计算机绘制图形的基本原理。实现分段线性插值不需编制函数程序,MATLAB自身提供了内部函数interp1其主要用法如下:interp1(x,y,xi) 一维插值◆ yiinterp1(…

Redis 很屌,不懂使用规范就糟蹋了

作者 | 码哥 来源 | 码哥字节❝这可能是最中肯的 Redis 使用规范了一网友昨天和我说,公司凌晨 12 点之后,网站用户量暴增,出现了一个技术故障,用户无法下单,当时老大火冒三丈!经过查找发现 Redis 报 C…

python统计字符在文件中出现的次数_一文搞定统计字符串中某字符出现的频次

下面是统计字符串中某字符出现的次数的方法 方法1: 这个方法相当简单,零基础自学编程,代码写成这样能满足需求,但它逐个逐个计数,比较笨拙。rlt {} for i in content: if i in rlt.keys(): rlt[i] 1 else: rlt[i] 1…

深度 | 数据仓库分层存储技术揭秘

简介: 作者: 沄浩、士远 一 、背景 据IDC发布的《数据时代2025》报告显示,全球每年产生的数据将从2018年的33ZB增长到2025年的175ZB,平均每天约产生491EB数据。随着数据量的不断增长,数据存储成本成为企业IT预算的重…

android tab 切换动画,Android之ViewPager+TabLayout组合实现导航条切换效果(微信和QQ底部多标签切换)...

前言之前在另外一篇中用Fragment和button实现了点击切换Fragment的效果,比较简陋。这次改用ViewPagerTabLayout 实现联动的效果。实现效果ViewPager 多个页面滑动TabLayout 和 ViewPager绑定,实现Fragment和标签绑定TabLayout的自定义标签以及选中颜色改…

5G 和云原生时代的技术下半场,视频化是最大最新的确定性

简介: 随着 5G/ 芯片 / 区块链等等新技术的不断成熟、云计算的普及和云原生时代带来的诸多便捷,开发者和架构师们眼前的挑战也不再只是 0-1 的建设问题,技术如何更多地带来业务价值成为了一个值得讨论的话题。阿里巴巴集团研究员,…

linux unzip命令不存在_15个常用基础命令Linux(很多人不知道!)

Linux 是码农最常用的的OS,很多操作都是命令行,所以很有必要熟练和理解其中一些重要的命令。这里会介绍一些。这里讲的所有都基于bash,mac也可以使用。!!这件事发生了几次? 输入并运行一条长命令后,您发现您忘记在开头添加sudo。 …

云安全的新战场上,要靠什么来抵御威胁

当谈及安全产业,你脑海里能够想到哪些事情?是红黑大战的攻防演练,还是PC上的各种安全软件?事实上,安全的范围远超我们的想象,安全产业也一直在背后,默默的保护在互联网生活的周围。 互联网的发…

函数计算助力高德地图平稳支撑亿级流量高峰

简介: 2020 年的“十一出行节”期间,高德地图创造了记录 ——截止 2020 年 10 月 1 日 13 时 27 分 27 秒,高德地图当日活跃用户突破 1 亿,比 2019 年 10 月 1 日提前 3 时 41 分达成此记录。 期间,Serverless 作为其中…

阿里云李克:阿里云边缘云计算的技术和实践

简介: 李克:边缘计算的核心目标是推动人、事、物的快速决策。 在4月7日下午举办的边缘计算论坛上,阿里云资深技术专家李克为我们带来了《阿里云边缘云计算的技术和实践》为题的精彩演讲。 备受关注的2021全球分布式云大会北京站于4月7日隆重…

如何快速学好python语言_如何快速的学习Python语言

本文主要向大家介绍了如何快速的学习Python语言,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。 基于自己的学习方法来分享,请客观的看待我提到的几点意见,谢谢。 文末有我自己在guihub上总结性写的一些Python实例…

数学在左,人生在右

在人们印象中,数学作为一门基础学科,由简单的数字和符号组成或简单或复杂的算式,融入我们的生活、学习、工作的方方面面,是理性、严谨的。 然而笔者在 2021 阿里巴巴全球数学竞赛颁奖典礼上看到数学的另一面:在数学的…

android保存字符到sd卡,android 保存TXT文件到SD卡方法

直接贴代码吧:import java.io.*;import android.util.Log;/*将调试信息保存到sdcard上*/public class DebugMessage{public static void put(String s,String name){try{FileOutputStream outStream new FileOutputStream("/sdcard/"name".txt"…

函数计算助力语雀构建稳定且安全的业务架构

简介: 语雀是一个专业的云端知识库,用于团队的文档协作。现在已是阿里员工进行文档编写和知识沉淀的标配,并于 2018 年开始对外提供服务。 客户介绍 语雀是一个专业的云端知识库,用于团队的文档协作。现在已是阿里员工进行文档编…