3

公開鍵を使用してネットワーク上で暗号化されたデータを共有する2つのプログラムを取得しようとしていますが、共有される情報(鍵や暗号化されたデータ)が変更されているように見えるという難しい問題に悩まされています。他の言語との互換性を確保するために、暗号化されたデータ形式とキーの形式をできるだけ単純に保つことを望んでいます。問題を解決するために、KeyreceiveとKeysendの2つのプログラムを作成しました。それらはこの順序で実行されます:

  1. Keyreceiveが起動し、暗号化されたデータの受信を待機します
  2. Keysendが起動してRSAキーを生成し、エクスポートされた秘密キーをファイルに保存します
  3. Keysendはデータを暗号化し、ネットワーク経由でKeyreceiveに送信します
  4. 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は元のメッセージ「helloworld」を出力しますが、Keyreceiverはぎこちない出力を出力します。暗号化されたデータとキー形式に「隠された」情報がある場合、それらを「純粋な」テキスト形式で書き込む方法はありますか?

4

1 に答える 1

5

どの行が問題の原因であるかについては正しいです。

connexion.send(str(enc_data))

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

connexion.send(enc_data[0])

その後、それはあなたが望むことをするはずです。

于 2011-07-30T22:20:43.330 に答える