Python: 将字符串转换为实例
Python: Convert string to instance
我是 Python 的新手,我已经被这个问题困扰了几个小时...我不知道如何将一个变量(字符串类型)转换为另一个变量(实例类型)。
>>from Crypto.PublicKey import RSA
>>from Crypto import Random
>>randomValue = Random.new().read
>>priv = RSA.generate(512, randomValue)
在这些代码行之后,创建了 "priv",其类型为 "instance"。
我必须使用 str(priv) 将此 "priv" 转换为类型字符串。
>>convertedToStr = str(priv)
>>type(convertedToStr)
<type 'str'>
现在,我需要将其转换回 'instance',并希望获得与原始 "priv" 相同的值和类型。假设我不能再使用 "priv",我需要将 "convertedToStr"(类型字符串)转换为 "convertedToStr"(类型实例)。
这有可能吗?
注意:我做这个复杂的事情的原因是因为我有客户端和服务器端,当一方使用 sendall(var) 向另一方发送消息时,它不允许我发送 'instance'。所以我必须在发送之前将其转换为字符串。现在,我想在接收方将其用作 'instance' 类型的变量,但我不知道如何将其转换回来。
instance
类型用于 Python 中旧式 classes 的实例 2. 您可能想查看 priv.__class__
而不是 type(priv)
来找出 class 它实际上有什么。我希望您会发现它的 class 是 Crypto.PublicKey.RSA._RSAObject
,因为这就是 return.
中记录的 generate
函数
我没有安装 Crypto
包,所以我实际上不知道在私钥实例上调用 str
时会得到什么字符串。您也许能够解析字符串,然后使用适当的值调用函数 Crypto.PublicKey.RSA.construct
来重建键对象。
但我认为这样做是多余的。您不应在键上调用 str
,而应调用其 exportKey
method。然后,在将字符串发送回其他系统后,您可以将其传递给 Crypto.PublicKey.RSA.importKey
.
请注意,通过网络发送私钥可能会使其遭到窃听,从而使其失效!你可能不应该这样做,除非你的两个系统之间的连接是用其他系统加密的。您的系统只有最弱的 link.
才安全
类型 instance
没有什么特别的,你可以自定义 class 并实例化它,它将具有类型 instance
:
>>> class x:
... y=1
...
>>> type(x())
<type 'instance'>
您不能通过调用 str()
任意将事物转换为字符串并保证获得有用的结果 - 它只是要求对象 return 一个可以表达任何内容的字符串。在这种情况下,您需要一个 512 字节长的 RSA 私钥,而 str() 输出长约 45 字节,从中获取完整对象状态所需的信息还不到 10%。
您要解决的一般问题是 serialization/deserialization,它是许多模块、库和协议的主题 - 但幸运的是,RSA 密钥很容易转换为有用的文本并再次转换回来(并非所有对象是)。
>>> out = priv.exportKey()
>>> new = RSA.importKey(out)
>>> new == priv
True
注意。当我尝试你的代码时,它清楚地向我抱怨 512 字节的密钥很弱并且拒绝生成它们,坚持 1024 字节或更多。您可能使用的是旧版本,但应指定更长的密钥长度。
我是 Python 的新手,我已经被这个问题困扰了几个小时...我不知道如何将一个变量(字符串类型)转换为另一个变量(实例类型)。
>>from Crypto.PublicKey import RSA
>>from Crypto import Random
>>randomValue = Random.new().read
>>priv = RSA.generate(512, randomValue)
在这些代码行之后,创建了 "priv",其类型为 "instance"。 我必须使用 str(priv) 将此 "priv" 转换为类型字符串。
>>convertedToStr = str(priv)
>>type(convertedToStr)
<type 'str'>
现在,我需要将其转换回 'instance',并希望获得与原始 "priv" 相同的值和类型。假设我不能再使用 "priv",我需要将 "convertedToStr"(类型字符串)转换为 "convertedToStr"(类型实例)。 这有可能吗?
注意:我做这个复杂的事情的原因是因为我有客户端和服务器端,当一方使用 sendall(var) 向另一方发送消息时,它不允许我发送 'instance'。所以我必须在发送之前将其转换为字符串。现在,我想在接收方将其用作 'instance' 类型的变量,但我不知道如何将其转换回来。
instance
类型用于 Python 中旧式 classes 的实例 2. 您可能想查看 priv.__class__
而不是 type(priv)
来找出 class 它实际上有什么。我希望您会发现它的 class 是 Crypto.PublicKey.RSA._RSAObject
,因为这就是 return.
generate
函数
我没有安装 Crypto
包,所以我实际上不知道在私钥实例上调用 str
时会得到什么字符串。您也许能够解析字符串,然后使用适当的值调用函数 Crypto.PublicKey.RSA.construct
来重建键对象。
但我认为这样做是多余的。您不应在键上调用 str
,而应调用其 exportKey
method。然后,在将字符串发送回其他系统后,您可以将其传递给 Crypto.PublicKey.RSA.importKey
.
请注意,通过网络发送私钥可能会使其遭到窃听,从而使其失效!你可能不应该这样做,除非你的两个系统之间的连接是用其他系统加密的。您的系统只有最弱的 link.
才安全类型 instance
没有什么特别的,你可以自定义 class 并实例化它,它将具有类型 instance
:
>>> class x:
... y=1
...
>>> type(x())
<type 'instance'>
您不能通过调用 str()
任意将事物转换为字符串并保证获得有用的结果 - 它只是要求对象 return 一个可以表达任何内容的字符串。在这种情况下,您需要一个 512 字节长的 RSA 私钥,而 str() 输出长约 45 字节,从中获取完整对象状态所需的信息还不到 10%。
您要解决的一般问题是 serialization/deserialization,它是许多模块、库和协议的主题 - 但幸运的是,RSA 密钥很容易转换为有用的文本并再次转换回来(并非所有对象是)。
>>> out = priv.exportKey()
>>> new = RSA.importKey(out)
>>> new == priv
True
注意。当我尝试你的代码时,它清楚地向我抱怨 512 字节的密钥很弱并且拒绝生成它们,坚持 1024 字节或更多。您可能使用的是旧版本,但应指定更长的密钥长度。