2016-09-04 3 views
0

私は、ソケットで送信したい公開鍵とユーザ名を持つリストを持っています。ソケットを介して送信するRSAキーをピケッとすることはできません

私は 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) 

エラーコンソールでは、キーがcryptography libraryで生成された

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

言います。

+2

あなたの質問は、なぜCFFIオブジェクトをピクルできないのかに関するものです。あなたがデータとしてソケットを介して任意のオブジェクトを送信したいが、あなたの問題は、簡単にピクルすることができない特定のタイプのオブジェクトにあるため、picklingする*理由*があります。 –

+0

'generateRSA()'関数が提供されているプロジェクトを教えてください。それから私たちは秘密鍵のデータを生成するのを手助けすることができます。今のところ、文字列ではなく簡単に送信できないオブジェクトです。 –

+1

これはPython暗号化ライブラリです。 https://cryptography.io/en/latest/hazmat/primitives/asymmetric/rsa/ –

答えて

0

RSAPublicKey instanceを送信しようとしていますが、これはPythonではなくSSLで管理されているデータ構造です。 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フォーマットにシリアル化するように更新されました。 –

関連する問題