【问题标题】:Obfuscating a string to be saved in a text file混淆要保存在文本文件中的字符串
【发布时间】:2018-05-16 20:43:01
【问题描述】:

我正在尝试对字符串进行模糊处理,以便用户不容易阅读。但是,混淆后的字符串应该是可以存储在文本文件中的字符串形式,而不是要存储在二进制文件中的字节形式。我尝试了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) 不起作用。

我怎样才能获得可以存储在文本文件中的类似结果?


编辑: 对应的decode 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)

【问题讨论】:

    标签: python-3.x encode


    【解决方案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*
    

    【讨论】:

    • 解码 fn 是否也需要更改?我在上面的问题的编辑中添加了解码 fn。
    • 不是 100% 确定尝试做什么,但可以将字符串编码为字节,即:bytes_out = some_string.encode('utf-8')
    • 这个bytes_out 可以保存为文本(不是二进制)文件中的字符串并作为字符串再次读取吗?
    • 我什至可以这样做:rebol.com/docs/words/wenbase.html,尽管其中没有密码键。
    • 请参阅cryptography.io/en/latest/fernet 以获得易于使用的良好加密/解密序列
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 2010-11-02
    • 2017-05-16
    相关资源
    最近更新 更多