如何使用 RSAPublicKey 字段腌制 namedtuple 子类
How to pickle namedtuple subclass with RSAPublicKey field
我正在尝试序列化 subclass namedtuple 的对象并保存对 RSAPublicKey 对象的引用。
我子class一个命名元组来创建不可变对象实例。
我的 class 的一个字段包含对类型 RSAPublicKey 对象的引用。
我定义 __setstate__(self) 来序列化 RSAPublicKey 对象以进行酸洗。
class实施
from collections import namedtuple
class MyClass(namedtuple('MyTuple', ['pub_key', 'foo'])):
def __getstate__(self):
return {
'pub_key': serialize(self.pub_key),
'foo': self.foo
}
def __repr__(self):
return f'MyClass({serialize(self.pub_key)}, {self.foo})'
正在使用
import pickle
pr, pu = generate_keys()
my_obj = MyClass(pu, 4)
密钥生成和序列化
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.backends import default_backend
def generate_keys():
priv = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
backend=default_backend()
)
return priv, priv.public_key()
def serialize(key):
return key.public_bytes(
serialization.Encoding.PEM,
serialization.PublicFormat.SubjectPublicKeyInfo
)
我收到以下错误。
TypeError Traceback (most recent call last)
<ipython-input-14-cb7f2cfd2a4d> in <module>
1 with open('save.dat', 'wb') as f:
----> 2 pickle.dump(my_obj, f)
TypeError: can't pickle CompiledFFI objects
当我将 class 更改为 subclass 对象时,序列化工作正常。
class MyClass():
def __init__(self, pub_key, foo):
self.pub_key = pub_key
self.foo = foo
def __getstate__(self):
return {
'pub_key': serialize(self.pub_key),
'foo': self.foo
}
def __repr__(self):
return f'MyClass({serialize(self.pub_key)}, {self.foo})'
这会起作用:
from collections import namedtuple
class MyClass(namedtuple('MyTuple', ['pub_key', 'foo'])):
def __getstate__(self):
return {
'pub_key': serialize(self.pub_key),
'foo': self.foo
}
def __repr__(self):
return f'MyClass({serialize(self.pub_key)}, {self.foo})'
#key generation and serialization
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.backends import default_backend
def generate_keys():
priv = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
backend=default_backend()
)
return priv, priv.public_key()
def serialize(key):
return key.public_bytes(
serialization.Encoding.PEM,
serialization.PublicFormat.SubjectPublicKeyInfo
)
import pickle
#dumping
pr, pu = generate_keys()
my_obj = MyClass(pu, 4)
with open('save.dat', 'wb') as f:
#getting the data from the class
pickle.dump(my_obj.__getstate__(), f)
它是一样的,但我使用 getstate 来获取数据而不是整个 class
我正在尝试序列化 subclass namedtuple 的对象并保存对 RSAPublicKey 对象的引用。
我子class一个命名元组来创建不可变对象实例。
我的 class 的一个字段包含对类型 RSAPublicKey 对象的引用。
我定义 __setstate__(self) 来序列化 RSAPublicKey 对象以进行酸洗。
class实施
from collections import namedtuple
class MyClass(namedtuple('MyTuple', ['pub_key', 'foo'])):
def __getstate__(self):
return {
'pub_key': serialize(self.pub_key),
'foo': self.foo
}
def __repr__(self):
return f'MyClass({serialize(self.pub_key)}, {self.foo})'
正在使用
import pickle
pr, pu = generate_keys()
my_obj = MyClass(pu, 4)
密钥生成和序列化
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.backends import default_backend
def generate_keys():
priv = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
backend=default_backend()
)
return priv, priv.public_key()
def serialize(key):
return key.public_bytes(
serialization.Encoding.PEM,
serialization.PublicFormat.SubjectPublicKeyInfo
)
我收到以下错误。
TypeError Traceback (most recent call last)
<ipython-input-14-cb7f2cfd2a4d> in <module>
1 with open('save.dat', 'wb') as f:
----> 2 pickle.dump(my_obj, f)
TypeError: can't pickle CompiledFFI objects
当我将 class 更改为 subclass 对象时,序列化工作正常。
class MyClass():
def __init__(self, pub_key, foo):
self.pub_key = pub_key
self.foo = foo
def __getstate__(self):
return {
'pub_key': serialize(self.pub_key),
'foo': self.foo
}
def __repr__(self):
return f'MyClass({serialize(self.pub_key)}, {self.foo})'
这会起作用:
from collections import namedtuple
class MyClass(namedtuple('MyTuple', ['pub_key', 'foo'])):
def __getstate__(self):
return {
'pub_key': serialize(self.pub_key),
'foo': self.foo
}
def __repr__(self):
return f'MyClass({serialize(self.pub_key)}, {self.foo})'
#key generation and serialization
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.backends import default_backend
def generate_keys():
priv = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
backend=default_backend()
)
return priv, priv.public_key()
def serialize(key):
return key.public_bytes(
serialization.Encoding.PEM,
serialization.PublicFormat.SubjectPublicKeyInfo
)
import pickle
#dumping
pr, pu = generate_keys()
my_obj = MyClass(pu, 4)
with open('save.dat', 'wb') as f:
#getting the data from the class
pickle.dump(my_obj.__getstate__(), f)
它是一样的,但我使用 getstate 来获取数据而不是整个 class