2016-09-04 58 views
0

我有一个公钥和用户名的列表,我想通过套接字发送。我发现 how to send an array over a socket in python但使用酸洗也不起作用。无法腌制一个RSA密钥通过套接字发送

我的代码:

private_key = generateRSA() 
public_key = private_key.public_key() 
host = '' 
port = 8000 
username = sys.argv[1] 
mySocket = socket.socket() 
mySocket.connect((host, port)) 
dataToSend = [public_key, username.encode()] 
dataSend = pickle.dumps(dataToSend) 
mySocket.send(dataSend) 

在控制台中的错误表示

 dataSend = pickle.dumps(dataToSend) 
_pickle.PicklingError: Can't pickle <class '_cffi_backend.CDataGCP'>: attribute lookup CDataGCP on _cffi_backend failed 

的关键是与cryptography library产生。

+2

你的问题应该是关于为什么你不能泡菜的CFFI对象。你正在酸洗的原因是因为你想通过套接字发送一个任意的对象作为数据,但是你的问题在于不容易被腌制的特定类型的对象。 –

+0

你能告诉我们什么项目提供'generateRSA()'函数吗?然后我们可以帮助您为私钥生成数据;它现在是一个不容易发送的对象,例如,不是一个字符串。 –

+1

这就是Python密码术库。 https://cryptography.io/en/latest/hazmat/primitives/asymmetric/rsa/ –

回答

0

您正在尝试发送RSAPublicKey instance,但这是一个由SSL管理的数据结构,而不是Python。因为你通过CFFI代理与它交互,所以你不能腌制其中的一个。

您需要选择一个key serialization format来发送它。你可以转换为PEM,例如:

from cryptography.hazmat.primitives import serialization 
pem = public_key.public_bytes(
    encoding=serialization.Encoding.PEM, 
    format=serialization.PublicFormat.SubjectPublicKeyInfo 
) 

以上会导出密钥为字符串值,那么你可以转换为字节和插座直接送过来。另一侧将再次从该字符串中输入load the key

请注意,上述使用不加密任何。拦截通过该套接字的流量的任何人都可以读取您的公钥。这可能会或可能不会成为您的应用程序的问题。

+0

它看起来像公共密钥的PEM版本是我想发送的。不是私钥! –

+0

@Amanda_Panda:啊,你链接到了RSA * Private *键的界面,这就给我扔了。我会更新。 –

+0

@Amanda_Panda:更新为使用'public_bytes()'方法串行化为最常见的PEM格式。 –