代码之家  ›  专栏  ›  技术社区  ›  rnso

混淆要保存在文本文件中的字符串

  •  1
  • rnso  · 技术社区  · 7 年前

    我试图混淆字符串,以便用户不容易读取。然而,模糊字符串的形式应该是可以存储在文本文件中的字符串,而不是以字节形式存储在二进制文件中。我试着从 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)
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   proximacentauri    7 年前
    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*