2011-07-30 17 views
3

公開鍵を使用してネットワーク上で暗号化されたデータを共有する2つのプログラムを取得しようとしていますが、難しい問題があります。暗号化されたデータ)が変更されるようです。私は他の言語との互換性を可能にするために、暗号化されたデータフォーマットと鍵のフォーマットをできるだけシンプルに保つことを望んでいます。 問題を解消するために、私は2つのプログラム、KeyreceiveとKeysendを作成しました。 彼らはこの順序で実行します。Python - 暗号化 - ネットワーク上で暗号化されたデータを送信

  1. Keyreceiveが
  2. Keysendは、作品を暗号化したファイルにエクスポートした秘密鍵を保存し、起動し
  3. Keysendが起動し、暗号化されたデータを受信するのを待つとRSA鍵を生成し、データのと
  4. Keyreceiveが同じファイルから秘密鍵をインポートし、ネットワーク経由Keyreceiveするためにそれを送信し、結果を確認するために
  5. Keysendも暗号化されたデータを復号化し、暗号化されたデータを復号化するためにそれを使用しています

Keysend.py

import socket 
import os 
from Crypto.PublicKey import RSA 
from Crypto import Random 

rng = Random.new().read 
RSAkey = RSA.generate(1024, rng) 

privatekey = RSAkey 
publickey = RSAkey.publickey() 
print(privatekey.exportKey()) #export under the 'PEM' format (I think) 
print(publickey.exportKey()) 

file = open("Keys.txt", "w") 
file.write(privatekey.exportKey()) #save exported private key 
file.close() 

data = "hello world" 
enc_data = publickey.encrypt(data, 16) #encrypt message with public key 
print(str(enc_data)) 

host = "localhost" 
port = 12800 
connexion = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
connexion.connect((host, port)) 
connexion.send(str(enc_data)) # send encrypted data, this appears to be the source of the problem 

dec_data = RSAkey.decrypt(enc_data) # test decryption 
print(dec_data) 

os.system("pause") 

Keyreceive.py

import socket 
import os 
from Crypto.PublicKey import RSA 
from Crypto import Random 

host = '' 
port = 12800 

connexion = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
connexion.bind((host, port)) 
connexion.listen(5) 
clientconnexion, connexioninfo = connexion.accept() 
enc_data = clientconnexion.recv(1024) # receive encrypted data 
print(enc_data) 

file = open("Keys.txt", "r") 
privatestr = file.read() # retrieve exported private key from file 
file.close() 
print(privatestr) 

privatekey = RSA.importKey(privatestr) # import private key 
data = privatekey.decrypt(enc_data) # decrypt sent encrypted data 
print(data) 

os.system("pause") 

両方のファイルが暗号化されたデータを復号化が終了した後、Keysenderは、元のメッセージを出力: "こんにちは世界" を、 KeyRceiverはぎこちなく出力します。 暗号化されたデータとキー形式に「隠された」情報がある場合、「純粋な」テキスト形式で書き込む方法がありますか?

+0

秘密鍵を持つファイルは安全にどのように転送されますか?これは絶望的に安全ではないことが分かりますか? SSLとは対照的に? – EJP

答えて

5

あなたが問題の原因となっている行が正しいと思います。ここで

connexion.send(str(enc_data)) 

enc_dataタプル、実際の暗号文を含む文字列となっている第一(及び実際には唯一の)要素です。 strを呼び出すと、タプルを文字列に変換しようとするPythonの試みが得られますが、これはあなたが望むものではありません。これに変更する場合は、

connexion.send(enc_data[0]) 

となります。

+0

素晴らしい!ありがとう;) – Kalessar