2014-11-22 2 views
-1

Я работаю над проектом, который позволяет людям обмениваться зашифрованными сообщениями.Не удается преобразовать строку байта обратно в строку

Я считаю, что проблема связана с передачей зашифрованного сообщения. Я передаю строку (сообщение) к этой функции

def sendInfo(host, port, sendObject): 

     socit = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     print("#Connecting") 
     socit.connect((host, port)) 
     print("#Sending") 
     #sendObject = unicode(sendObject, 'utf-8') 
     #bites = str.encode(sendObject) 

     bites = bytes(sendObject) 
     print str(bites) 
     #bites = pickle.dumps(sendObject) 
     socit.send(bites) 

     socit.close() 

     print("Sent successfully") 

Пример передаваемого сообщения я получаю при отъезде:

"'\x02\xc6\x07\xa5\xb1\xc4t\xd4\x8e\xf1e\xc3r\x17\xc6T\xec\x9bm\xbe\xf8\xb4J3\x9d\xeej\xf2N\xec\x8a\xc1\xbf\xdc\xe8\x8f\xc3\x1d\n\xea\x9b\x02\x99i\\o\xb3\xed\x7f-\x0b4]f}\x8f\x1e\xdcJ\xefo\xabR\x1a\x14N/O"\xa5\xa8X\xa5\xd9\xf2\xfb\xab7\xf7\xd67\xd4Y\xa1\x85\x9a\xfc\xfe\x8d\x03\',\x89k|NY"\xbc\x7f\xe0\x0b\xc56\xd6G\xc3Y\xac\x98\x88\x1fn\x8bz\xcaMi\xfd\xe4Lj\xa3\xbc'" 

который я затем преобразовать в этот, который я надеюсь, является приемлемым в кодировке UTF-8 :

"(x02\xc6\x07\xa5\xb1\xc4t\xd4\x8e\xf1e\xc3r\x17\xc6T\xec\x9bm\xbe\xf8\xb4J3\x9d\xeej\xf2N\xec\x8a\xc1\xbf\xdc\xe8\x8f\xc3\x1d\n\xea\x9b\x02\x99i\\o\xb3\xed\x7f-\x0b4]f}\x8f\x1e\xdcJ\xefo\xabR\x1a\x14N/O"\xa5\xa8X\xa5\xd9\xf2\xfb\xab7\xf7\xd67\xd4Y\xa1\x85\x9a\xfc\xfe\x8d\x03\',\x89k|NY"\xbc\x7f\xe0\x0b\xc56\xd6G\xc3Y\xac\x98\x88\x1fn\x8bz\xcaMi\xfd\xe4Lj\xa3\xbc" 

код я использовал для расшифровки на основе библиотеки pyrsa (http://stuvel.eu/rsa):

def decrypt(message, privKey): 
    return rsa.decrypt(message, privacy) 

Я получаю ошибку при отъезде:

Traceback (most recent call last): 
    File "/Users/Andrew/Shatter/ShatterListen.py", line 142, in <module> 
    main() 
    File "/Users/Andrew/Shatter/ShatterListen.py", line 127, in main 
    ciphertext = ShatterRSA.decrypt(ciphertext, listenerKey[1]) 
    File "/Users/Andrew/Shatter/ShatterRSA.py", line 85, in decrypt 
    return rsa.decrypt(message, privKey) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/rsa/pkcs1.py", line 232, in decrypt 
    raise DecryptionError('Decryption failed') 
DecryptionError: Decryption failed 

Если кто-то может пролить некоторый свет на ситуацию и сделать некоторые предложения о том, что может быть проблемой. Я на 90% уверен, что переданная строка неправильно декодируется, и откуда исходит ошибка, но я понятия не имею, что я могу попробовать. Если вы хотите больше кода или информации, я рад предоставить его.

EDIT:

Вот код, показывающий процесс шифрования в одном модуле, не передается:

key = create_key(1024) 
ciphertext = encrypt('Hey there!', key[0]) 
print ciphertext 
print decrypt(ciphertext, key[1]) 

Выход из которых:

>>> 

Hey there! 
>>> 
+0

Во-первых, в Python 2.x, 'str' и' bytes' являются тот же тип, поэтому преобразование между ними не делает вам ничего хорошего. – abarnert

+0

Между тем, похоже, вы пытаетесь отправить строковое представление строкового представления некоторых двоичных данных. Зачем? И если это то, что у вас есть, это гарантированно будет ASCII, так почему вы беспокоитесь о кодировании и декодировании как UTF-8? – abarnert

+0

В любом случае, ваша проблема, скорее всего, вызвана тем, что вы получили строковое представление строкового представления двоичного зашифрованного текста, а не двоичного зашифрованного текста, и, конечно же, вы не можете его расшифровать. – abarnert

ответ

1

байт- строка "(x02\xc6\x07\xa5\xb1\xc4t ..." не является допустимым потоком UTF-8. После \xc6, который начинается с битов 110, следующий байт должен начинаться с бит 10, который \x07 этого не делает. Хорошее резюме того, как работает кодирование, можно найти в the Wikipedia article.

Вы сказали, что вы превратили полученный шифрованный текст в эту строку; Я предполагаю, что это было через шаг расшифровки RSA? Если это так, то есть несколько вещей, чтобы проверить:

  • вы используете неправильный зашифровать или расшифровать ключ (тот же ключ для обеих операций и т.д.)
  • данные были в противном случае не правильно шифрованные
  • что-то искажает данные между этапами шифрования и дешифрования (одна из возможностей может быть схемой пакетирования, которая не является одинаковой между отправителем и получателем)
+1

Кроме того, вы не спрашивали, но я надеюсь, вы не планируете делать что-либо «реальное» с этим. Правильное использование этого материала требует много времени и много испытаний огнем. Используйте затвердевший криптокод, который уже был сражен для производственных приложений. – wberry

+1

Запуск двоичного зашифрованного текста невероятно маловероятен, чтобы быть допустимым потоком UTF-8. Но я не думаю, что это его проблема. Он даже не делает декодирования UTF-8 в своем коде; он передает эти байты (или, возможно, это настоящая строка с обратными косыми чертами и x's? Я все еще не уверен ...) для функции дешифрования as-is и они не дешифруются. – abarnert

+0

Спасибо за ваш ответ. Когда я ссылался на «преобразование» строки, я имел в виду сериализацию вывода для передачи - после ее шифрования. Строка, которую я опубликовал, была до этапа дешифрования. Я понимаю, что шифрование не подходит для подлинного проекта, это скорее доказательство концептуального приложения, чем то, что я ожидаю, что оно будет действительно безопасным. – cluskii

Смежные вопросы