首先是如何读取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)