无法腌制 RSA 密钥以通过套接字发送
Can't pickle an RSA key to send over a socket
我有一个列表,其中包含一个 public 密钥和一个我想通过套接字发送的用户名。
我找到了
how to send an array over a socket in python 但使用酸洗也不起作用。
我的代码:
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 生成的。
您正在尝试发送 RSAPublicKey
instance,但这是一个由 SSL 管理的数据结构,而不是 Python。因为您通过 CFFI 代理与它交互,所以您不能 pickle 其中之一。
您需要选择 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。
请注意,以上内容没有任何加密。任何通过该套接字拦截流量的人都能够读取您的 public 密钥。这对您的应用程序来说可能是问题,也可能不是问题。
我有一个列表,其中包含一个 public 密钥和一个我想通过套接字发送的用户名。
我找到了 how to send an array over a socket in python 但使用酸洗也不起作用。
我的代码:
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 生成的。
您正在尝试发送 RSAPublicKey
instance,但这是一个由 SSL 管理的数据结构,而不是 Python。因为您通过 CFFI 代理与它交互,所以您不能 pickle 其中之一。
您需要选择 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。
请注意,以上内容没有任何加密。任何通过该套接字拦截流量的人都能够读取您的 public 密钥。这对您的应用程序来说可能是问题,也可能不是问题。