文章目录

  • python实现加解密文本文件(一)
  • 一.异或操作
  • 二.字节串和字符串
  • 三.int.from_bytes函数
  • 四.json模块
  • 五.pathlib库的Path类


python实现加解密文本文件(一)

在做实验之前,先对一些知识加深一下了解~~~~

一.异或操作

python中的位运算符’^’,在计算时按位异或,相同值异或为0,不同值异或为1.

eg: 0^0 = 0, 0^1 = 1

注意:这里按位异或,所以不管输入的是十进制数还是十六进制数等,计算机内部都会将其转化成二进制数,并进行右对齐,必要时会在前面补0,且满足结合律。

eg: 3^2 = (011)^(010) = (001) = 1
    2^3^5 = 2^(3^5) = 4

所以我们要对文件进行加密,首先要将文件转化为二进制数,再生成与这个二进制数对应的、等长的随机密钥,然后将这个二进制数与随机密钥进行异或操作,得到的即为加密后的异或操作。
解密时,将这个二进制数和原来的密钥进行异或操作,得到的即为初始的二进制数,最后再将初始的二进制数转化为对应的文本文件。

生成随机密钥的函数:secrets模块中的token_bytes库函数

二.字节串和字符串

字符 是指计算机中使用的字母、数字、字和符号,包括:1、2、3、A、B、C、~!·#¥%……—*()——+等等。在UTF-8编码 中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3个字节。一个英文就用八位二进制数表示,一个汉字就用3个八位二进制表示

字符串是字符序列,它是一种抽象的概念,不能直接存储在硬盘。
字节串是字节序列,它可以直接存储在硬盘。它们之间的映射被称为编码/解码。
简单来说,就是字节串是给计算机看的,给计算机传输或者保存的,而字符串是给人看的,用来操作的。
   在Python中,程序中的文本都用字符串表示。
#字节串
byte_str = b'Our love can not tolerate other people.'
print(type(byte_str))
<class 'bytes'>
#字符串
text_str = 'Our love can not tolerate other people.'
print(type(text_str))
<class 'str'>

#二者的转化(字符串编码后得到对应的字节串,字节串解码后得到对应的字符串)
print(text_str.encode('utf-8'))
b'Our love can not tolerate other people.'

print(byte_str.decode('utf-8'))
Our love can not tolerate other people.

三.int.from_bytes函数

功能:res = int.from_bytes(x)的含义是把bytes类型的变量x,转化为十进制整数,并存入res中。其中bytes类型是python3特有的类型。
函数参数:int.from_bytes(bytes, byteorder)。在IDLE或者命令行界面中使用help(int.from_bytes)命令可以查看具体介绍。bytes是输入的变量;byteorder主要有两种:'big'和'little',是高低位标志,’big‘表示高位在前,’little‘表示低位在前。

四.json模块

JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。JSON的数据格式其实就是python里面的字典格式,里面可以包含方括号括起来的数组,也就是python里面的列表。
json提供了四个方法:dumps、dump序列化方法,loads、load反序列化方法
dumps:将数据通过特殊的形式转换为所有程序语言都认识的字符串
dump:将数据通过特殊的形式转换为所有程序语言都认识的字符串,并写入文件
loads:将json编码的字符串再转换位python数据结构
load:从数据文件中读取数据,并将json编码的字符串再转换位python数据结构

eg:

>>> import json
>>> json.dumps([])    # dumps可以格式化所有的基本数据类型为字符串
'[]'
>>> json.dumps(1)    # 数字
'1'
>>> json.dumps('1')   # 字符串
'"1"'
>>> dict = {"name":"Tom", "age":23}  
>>> json.dumps(dict)     # 字典
'{"name": "Tom", "age": 23}'
import json
with open("test.json", "r", encoding='utf-8') as f:
    aa = json.loads(f.read())
    f.seek(0)
    bb = json.load(f)    # 与 json.loads(f.read())
print(aa)
print(bb)

# 输出:
{'name': 'Tom', 'age': 23}
{'name': 'Tom', 'age': 23}

五.pathlib库的Path类

1.调用库

from pathlib import Path

2.创建Path对象

path = Path(path)

3.Path.cwd() 获取当前文件路径

cwd = Path.cwd() 
print(cwd)		#输出当前文件的路径

4.Path.exists() 判断当前路径是否是文件或文件夹

Path(path).exists()

返回True或者False

5.Path.mkdir(mode=0o777,parents=Fasle) 根据路径创建文件夹
parents=True时,会依次创建路径中间缺少的文件夹

p_new = p/'xxx'
p_new.mkdir()	#创建一个名为xxx的文件夹

p_news = p/'A/B'
p_news.mkdir(parents=True)	#创建一个A文件夹,并在A文件夹下创建B文件夹

6.Path.open(mode=’r’, buffering=-1, encoding=None, errors=None, newline=None) 打开文件夹

7.路径操作

from pathlib import Path

p1 = Path()
p2 = Path('a','b','c/d')
p3 = Path('/abc')
print(p1,p2,p3)
#输出:. a\b\c\d \abc

路径拼接和分解:
操作符/ Path对象/Path对象;Path对象/字符串;字符串/Path对象
分解:parts属性,可以返回路径中的每一部分

from pathlib import Path

p = Path()
p = p/'a'
p1 = 'b'/p
p2 = Path('/c')
p3 = p2 / p1
print(p3)
print(p3.parts)
#输出:\c\b\a
# 	('\\', 'c', 'b', 'a')

8.Path.name 获取path路径最后一级的文件名