我正在尝试对字符串进行模糊处理,以便用户无法轻松阅读。但是,混淆的字符串应该是一个字符串,可以存储在文本文件中,而不是以字节形式存储在二进制文件中。我尝试了Simple way to encode a string according to a password?的一些方法,但没有成功:
def myencode(ori_str, key):
enc = []
for i in range(len(ori_str)):
key_c = key[i % len(key)]
enc_c = (ord(ori_str[i]) + ord(key_c)) % 256
enc.append(enc_c)
return base64.urlsafe_b64encode(bytes(enc))
上述fn的输出需要存储在二进制文件中。将..._b64encode(bytes(enc))
更改为..._b64encode(enc)
不起作用。
如何获得可以存储在文本文件中的类似结果?
编辑: 相应的解码fn如下:
def mydecode(enc_str, key):
dec = []
enc_str = base64.urlsafe_b64decode(enc_str)
for i in range(len(enc_str)):
key_c = key[i % len(key)]
dec_c = chr((256 + enc_str[i] - ord(key_c)) % 256)
dec.append(dec_c)
return "".join(dec)
答案 0 :(得分:1)
def myencode_str(ori_str, key):
enc = []
for i in range(len(ori_str)):
key_c = key[i % len(key)]
enc_c = (ord(ori_str[i]) + ord(key_c)) % 256
enc.append(enc_c)
return (base64.urlsafe_b64encode(bytes(enc))).decode("utf-8")
或在此处查看完整示例:
from cryptography.fernet import Fernet
class Encrypt(object):
'''
see https://cryptography.io/en/latest/fernet/
'''
@classmethod
def encrypt(cls, plain_text):
'''
@param enctypted_text: str or bytes
@return cipher_text: str (.decode() converts the byte string to string)
'''
if isinstance(plain_text, str):
plain_text = plain_text.encode()
elif not isinstance(plain_text, bytes):
raise ValueError('Value must be string or bytes')
cipher_suite = Fernet(config.KEY.encode())
cipher_text = cipher_suite.encrypt(plain_text).decode()
return cipher_text
@classmethod
def decrypt(cls, enctypted_text):
'''
@param enctypted_text: str or bytes
@return plain_text: str (.decode() converts the byte string to string)
'''
if isinstance(enctypted_text, str):
enctypted_text = enctypted_text.encode()
elif not isinstance(enctypted_text, bytes):
raise ValueError('Value must be string or bytes')
cipher_suite = Fernet(config.KEY.encode())
plain_text = cipher_suite.decrypt(enctypted_text).decode()
return plain_text
@classmethod
def generateKey(cls):
key = Fernet.generate_key()
return key*