我使用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
你的代码看起来有点奇怪。
如果您正在创建一个类对象,那么使用绑定到该对象(非静态)的方法并使代码更加面向对象是合乎逻辑的。
我建议您:摆脱静态方法,通过
Property\Дескрипторы
类对象使私有属性更易于访问和使用,而不是通过静态调用。或者甚至在模块级别解决所有问题,而根本不需要创建类。此外,您的密钥始终具有32 个字符的固定长度(这本身不是问题,但是..)。并且您不会检查数据是否比密钥短或长。因此会出现问题 - 如果字符串长度超过32 个字符,则多余的字符将不会被加密。对我来说,这是不合逻辑的。
通过类:
结论:
在模块级别:
结论:
不过,如果您想通过类来完成此操作,但不需要创建对象,那么
@staticmethod
最好使用它@classmethod
(这样我们将明确保留对类属性的访问),并通过访问私有属性getter和setter: