RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1595821
Accepted
dynamic.aerospace.inc
dynamic.aerospace.inc
Asked:2024-10-06 06:56:30 +0000 UTC2024-10-06 06:56:30 +0000 UTC 2024-10-06 06:56:30 +0000 UTC

Python 函数中的私有变量

  • 772

我使用Vernam 的代码编写了加密和解密字符串的代码。该代码工作正常,并将字符串转换为加密字符串,反之亦然。但是有一个小问题,由于主要变量被设为私有,我无法将它们添加为函数中的标准参数,我该怎么做? (下面的例子)

程序代码:

import string
import random


class Cipher:
    __encryption_key = ""
    __user_data = ""

    @staticmethod
    def add_string(user_data) -> None:
        Cipher.__user_data = user_data

    @staticmethod
    def clear_user_data():
        del Cipher.__user_data

    @staticmethod
    def generate_encryption_key(length_key=32) -> str:
        Cipher.__encryption_key = "".join("".join(random.choices(string.ascii_letters, k=length_key)))
        return Cipher.__encryption_key

    @staticmethod
    def clear_encryption_key():
        del Cipher.__encryption_key

    @staticmethod
    def encrypt_user_string() -> str:
        encrypt_user_string = "".join(chr(ord(p) ^ ord(k)) for p, k in zip(Cipher.__user_data,
                                                                           Cipher.__encryption_key))
        return encrypt_user_string

    @staticmethod
    def decrypt_user_string(encryption_data: str, encryption_key: str) -> str:
        decrypt_user_string = "".join(chr(ord(c) ^ ord(k)) for c, k in zip(encryption_data, encryption_key))
        return decrypt_user_string

现在是这样的:

@staticmethod
    def decrypt_user_string(encryption_data: str, encryption_key: str) -> str:
        decrypt_user_string = "".join(chr(ord(c) ^ ord(k)) for c, k in zip(encryption_data, encryption_key))
        return decrypt_user_string

你需要这样的东西:

 @staticmethod
    def decrypt_user_string(encryption_data=encrypt_user_string(), encryption_key: Cipher.__encryption_key) -> str:
        decrypt_user_string = "".join(chr(ord(c) ^ ord(k)) for c, k in zip(encryption_data, encryption_key))

如何做到这一点?检查程序运行情况的代码:

from vernam_cipher import Cipher


if __name__ == "__main__":
    user_data = "Привет, мир!"

    cipher = Cipher()
    encryption_key = cipher.generate_encryption_key()
    print(f"Ключ шифрования данных: {encryption_key}")

    cipher.add_string(user_data)

    print(f"Данные: {cipher._Cipher__user_data}")

    encrypt_user_string = cipher.encrypt_user_string()
    print(f"Зашифрованные данные: {encrypt_user_string}")
    decrypt_user_string = cipher.decrypt_user_string(encrypt_user_string, encryption_key)
    print(f"Расшифрованные данные: {decrypt_user_string}")

        return decrypt_user_string
python
  • 1 1 个回答
  • 43 Views

1 个回答

  • Voted
  1. Best Answer
    Amgarak
    2024-10-06T08:04:49Z2024-10-06T08:04:49Z

    你的代码看起来有点奇怪。

    如果您正在创建一个类对象,那么使用绑定到该对象(非静态)的方法并使代码更加面向对象是合乎逻辑的。

    我建议您:摆脱静态方法,通过Property\Дескрипторы类对象使私有属性更易于访问和使用,而不是通过静态调用。或者甚至在模块级别解决所有问题,而根本不需要创建类。


    此外,您的密钥始终具有32 个字符的固定长度(这本身不是问题,但是..)。并且您不会检查数据是否比密钥短或长。因此会出现问题 - 如果字符串长度超过32 个字符,则多余的字符将不会被加密。对我来说,这是不合逻辑的。


    通过类:

    import string
    import random
    
    class Cipher:
        def __init__(self, user_data=""):
            self.__encryption_key = ""
            self.__user_data = user_data
            self.__encrypted_data = ""
    
        @property
        def user_data(self):
            if not self.__user_data:
                return "Данных нет"
            return self.__user_data
    
        @user_data.setter
        def user_data(self, value):
            self.__user_data = value
    
        @property
        def encryption_key(self):
            if not self.__encryption_key:
                return "Ключ шифрования не был сгенерирован."
            return self.__encryption_key
    
        @property
        def encrypted_data(self):
            if not self.__encrypted_data:
                return "Зашифрованных данных нет."
            return self.__encrypted_data
    
        def generate_encryption_key(self, length_key=32) -> str:
            self.__encryption_key = "".join(random.choices(string.ascii_letters, k=length_key))
            return self.__encryption_key
    
        def encrypt_user_string(self) -> str:
            if not self.__encryption_key:
                raise ValueError("Ключ шифрования не был сгенерирован.")
            if not self.__user_data:
                raise ValueError("Нет данных для шифрования.")
    
            extended_key = (self.__encryption_key * (len(self.__user_data) // len(self.__encryption_key) + 1))[:len(self.__user_data)]
            
            self.__encrypted_data = "".join(chr(ord(p) ^ ord(k)) for p, k in zip(self.__user_data, extended_key))
            return self.__encrypted_data
    
        def decrypt_user_string(self) -> str:
            if not self.__encrypted_data:
                raise ValueError("Нет данных для расшифровки.")
            if not self.__encryption_key:
                raise ValueError("Ключ шифрования не был сгенерирован.")
            
            extended_key = (self.__encryption_key * (len(self.__encrypted_data) // len(self.__encryption_key) + 1))[:len(self.__encrypted_data)]
            
            return "".join(chr(ord(c) ^ ord(k)) for c, k in zip(self.__encrypted_data, extended_key))
    
    if __name__ == "__main__":
    
        user_data = "Привет, мир! Длинная строка для шифрования. Длинная строка для шифрования. Длинная строка для шифрования. Длинна > 32"
    
        cipher = Cipher()
        print(cipher.user_data)
        print(cipher.encryption_key)
        print(cipher.encrypted_data)
        
        cipher.user_data = user_data
        print(f"Данные: {cipher.user_data}")
    
        encryption_key = cipher.generate_encryption_key()
        print(f"Ключ шифрования данных: {encryption_key}")
        print(f"Ключ: {cipher.encryption_key}")
        
        encrypted_data = cipher.encrypt_user_string()
        print(f"Зашифрованные данные: {encrypted_data}")
        print(f"Зашифрованные: {cipher.encrypted_data}")
        
        decrypted_data = cipher.decrypt_user_string()
        print(f"Расшифрованные данные: {decrypted_data}")
    

    结论:

    Данных нет
    Ключ шифрования не был сгенерирован.
    Зашифрованных данных нет.
    Данные: Привет, мир! Длинная строка для шифрования. Длинная строка для шифрования. Длинная строка для шифрования. Длинна > 32
    Ключ шифрования данных: CTLhjjBALdqkMaqBOEpUqmsPVpzfJrUX
    Ключ: CTLhjjBALdqkMaqBOEpUqmsPVpzfJrUX
    Зашифрованные данные: ќДѴњџШnaѰќбJmѵъѺѲѸрКQЬбАѨъъFѾщКxЋѬЈШєјѲѼѴЫ_KљњщѿѲѵпuаЯгѮѬрZђѱнuАѻАЌіјњѿѹЃJQѿѶљьѿѿЊPДгЭэѪѦPюѝЅRНѠЇДѲњњїѺЎbDѥѐѵќьѲo{PfC
    Зашифрованные: ќДѴњџШnaѰќбJmѵъѺѲѸрКQЬбАѨъъFѾщКxЋѬЈШєјѲѼѴЫ_KљњщѿѲѵпuаЯгѮѬрZђѱнuАѻАЌіјњѿѹЃJQѿѶљьѿѿЊPДгЭэѪѦPюѝЅRНѠЇДѲњњїѺЎbDѥѐѵќьѲo{PfC
    Расшифрованные данные: Привет, мир! Длинная строка для шифрования. Длинная строка для шифрования. Длинная строка для шифрования. Длинна > 32
    

    在模块级别:

    import string
    import random
    
    
    def generate_encryption_key(length_key=32) -> str:
        return "".join(random.choices(string.ascii_letters, k=length_key))
    
    
    def encrypt_string(user_data: str, encryption_key: str) -> str:
        if not encryption_key:
            raise ValueError("Ключ шифрования не был передан.")
        if not user_data:
            raise ValueError("Нет данных для шифрования.")
        
        extended_key = (encryption_key * (len(user_data) // len(encryption_key) + 1))[:len(user_data)]
        
        return "".join(chr(ord(p) ^ ord(k)) for p, k in zip(user_data, extended_key))
    
    
    def decrypt_string(encrypted_data: str, encryption_key: str) -> str:
        if not encrypted_data:
            raise ValueError("Нет данных для расшифровки.")
        if not encryption_key:
            raise ValueError("Ключ шифрования не был передан.")
        
        extended_key = (encryption_key * (len(encrypted_data) // len(encryption_key) + 1))[:len(encrypted_data)]
        
        return "".join(chr(ord(c) ^ ord(k)) for c, k in zip(encrypted_data, extended_key))
    
    
    if __name__ == "__main__":
        user_data = "Привет, мир! Длинная строка для шифрования. Длинная строка для шифрования. Длинная строка для шифрования. Длинна > 32"
        
        encryption_key = generate_encryption_key()
        print(f"Ключ шифрования данных: {encryption_key}")
        
        encrypted_data = encrypt_string(user_data, encryption_key)
        print(f"Зашифрованные данные: {encrypted_data}")
        
        decrypted_data = decrypt_string(encrypted_data, encryption_key)
        print(f"Расшифрованные данные: {decrypted_data}")
    

    结论:

    Ключ шифрования данных: VxWnsvSsPzbPhxcIZytTQXTKAeMqgzll
    Зашифрованные данные: щиѯќцдSѬтТqHѬјѱѧффЛqЙЖЋѿџѽQѓсУLОрГЮэфѣюѨеLpѼућѴѧщлtАКДѵѻѕmхќеLФѮмЗѐсцѮыПTBфѓрўѴѪжTЕГИѪѱѱEѹъШZФєВиѩќуыѫм~ZѶѫѐхўѹzGTgc
    Расшифрованные данные: Привет, мир! Длинная строка для шифрования. Длинная строка для шифрования. Длинная строка для шифрования. Длинна > 32
    

    不过,如果您想通过类来完成此操作,但不需要创建对象,那么@staticmethod最好使用它@classmethod(这样我们将明确保留对类属性的访问),并通过访问私有属性getter和setter:

    import string
    import random
    
    
    class Cipher:
        __encryption_key = ""
        __encrypted_data = ""
        
        def __new__(cls):
            raise TypeError("Как вариант, можно запретить создание экземпляра класса Cipher")
    
        @classmethod
        def generate_encryption_key(cls, length_key=32) -> str:
            cls.__encryption_key = "".join(random.choices(string.ascii_letters, k=length_key))
            return cls.__encryption_key
    
        @classmethod
        def set_encrypted_data(cls, data: str):
            cls.__encrypted_data = data
    
        @classmethod
        def get_encryption_key(cls) -> str:
            return cls.__encryption_key
    
        @classmethod
        def get_encrypted_data(cls) -> str:
            return cls.__encrypted_data
    
        @classmethod
        def encrypt_string(cls, user_data: str) -> str:
            if not cls.__encryption_key:
                raise ValueError("Ключ шифрования не был сгенерирован.")
            if not user_data:
                raise ValueError("Нет данных для шифрования.")
    
            extended_key = (cls.__encryption_key * (len(user_data) // len(cls.__encryption_key) + 1))[:len(user_data)]
    
            encrypted_data = "".join(chr(ord(p) ^ ord(k)) for p, k in zip(user_data, extended_key))
            cls.set_encrypted_data(encrypted_data)  # Сохраняем зашифрованные данные
            return encrypted_data
    
        @classmethod
        def decrypt_string(cls, encryption_data: str = None, encryption_key: str = None) -> str:
            if encryption_data is None:
                encryption_data = cls.get_encrypted_data()  # Используем хранящиеся данные
            if encryption_key is None:
                encryption_key = cls.get_encryption_key()  # Используем хранящийся ключ
    
            if not encryption_data:
                raise ValueError("Нет данных для расшифровки.")
            if not encryption_key:
                raise ValueError("Ключ шифрования не был передан.")
    
            extended_key = (encryption_key * (len(encryption_data) // len(encryption_key) + 1))[:len(encryption_data)]
    
            return "".join(chr(ord(c) ^ ord(k)) for c, k in zip(encryption_data, extended_key))
    
    
    if __name__ == "__main__":
        user_data = "Привет, мир! Длинная строка для шифрования."
    
        encryption_key = Cipher.generate_encryption_key()
        print(f"Ключ шифрования данных: {encryption_key}")
    
        encrypted_data = Cipher.encrypt_string(user_data)
        print(f"Зашифрованные данные: {encrypted_data}")
    
        decrypted_data = Cipher.decrypt_string()  
        print(f"Расшифрованные данные: {decrypted_data}")
    
    • 2

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5