Python - Pycrypto - отправка зашифрованных данных по сети - PullRequest
3 голосов
/ 31 июля 2011

Я пытаюсь заставить две программы обмениваться зашифрованными данными по сети, используя открытые ключи, но я застрял с трудной проблемой: информация, которая передается (ключи и / или зашифрованные данные), кажется, изменена.Я надеюсь сохранить формат зашифрованных данных, а также формат ключей как можно более простым, чтобы обеспечить совместимость с другими языками.Чтобы решить эту проблему, я создал 2 программы: Keyreceive и Keysend.Они выполняются в следующем порядке:

  1. Прием ключей запускается и ожидает получения зашифрованных данных
  2. Запуск ключей и генерирует ключ 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 выводит исходное сообщение: «hello world», тогда как Keyreceiver выводит бессмысленное.Если в зашифрованных данных и форматах ключей есть «скрытая» информация, будет ли какой-то способ записать их в «чистый» текстовый формат?

1 Ответ

5 голосов
/ 31 июля 2011

Вы правы относительно того, какая строка является источником проблемы.

connexion.send(str(enc_data))

enc_data - это кортеж , первым (и фактически единственным) элементом которого является строка, содержащая фактический зашифрованный текст. Когда вы вызываете str, вы получаете попытку Python преобразовать кортеж в строку, а это не то, что вам нужно. Если вы измените это на это:

connexion.send(enc_data[0])

тогда он должен делать то, что вы хотите.

...