首先是如何读取txt和写入txt
写入txt的代码如下:
# 写入
file_handle = open('./text.txt', mode='w')
file_handle.write("2003050204\n" + "123456")
file_handle.close()
读取的代码如下,需要注意的时contents是一个列表类型的变量。
# 读取
file_handle = open('./text.txt', mode='r')
contents = file_handle.readlines()
print(contents)
如何加密
下面的代码为加密和解密的函数,首先encrpt是加密部分,decrypt是解密部分。
from secrets import token_bytes
def random_key(length):
key = token_bytes(nbytes=length)
key_int = int.from_bytes(key, 'big')
return key_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
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()
加密解密的原理
encrypt 函数接受一个 str 对象,返回元组 (int, int)。通过 encode 方法,我们将字符串编码成字节串。int.from_bytes 函数将字节串转换为 int 对象。最后对二进制对象和随机密钥进行异或操作,就得到了加密文本。
decrypt 接受两个 int 对象,分别为加密文本和随机密钥。首先对两者进行异或操作,计算解密出来的 int 对象所占比特数。decrypted.bit_length函数得到的是二进制数的位数,除以 8 可以得到所占比特大小。为了防止,1 ~ 7 位的二进制数整除 8 得到 0,所以要加上 7,然后再进行整除 8 的操作。使用 int.to_bytes 函数将解密之后的 int 的对象转换成 bytes 对象。最后通过 decode 方法,将字节串转换成字符串。
样例代码
str = "123456"
pwd = encrypt(str)
print(pwd)
pwd_2 = decrypt(*pwd)
print(pwd_2)