2016-02-18 3 views
0

У меня есть клиент/серверная программа, где клиент отправляет открытый текст на сервер, который затем запускает шифрование AES и возвращает зашифрованный текст. Я использую следующий алгоритм для шифрования/дешифрования:Python - данные, отправленные через сокет, различаются по клиенту и серверу

http://anh.cs.luc.edu/331/code/aes.py

Когда я получаю результаты обратно из шифрования и распечатать их на стороне сервера я вижу в основном тарабарщину в терминале. Я могу сохранить в файл сразу и получить что-то вдоль этих линий:

tgâY†Äô®Ø8ί6ƒlÑÝ%ŠIç°´>§À¥0Ð 

Я могу видеть, что это правильный выход, потому что, если я немедленно расшифровать его на сервере, я получаю исходный открытый текст обратно. Если я запускаю это через сокет, отправить его обратно клиенту, и печать(), я получаю что-то больше, как это:

\rtg\xe2Y\x86\x8f\xc4\xf4\xae\xd88\xce\xaf6\x83l\xd1\xdd%\x8aI\xe7\xb0\xb4>\xa7\xc0\x18\xa50\xd0 

Там очевидная разница. Я знаю, что \ x представляет шестнадцатеричное значение. Если я сохраню на стороне клиента, итоговый текстовый файл все еще содержит все экземпляры \ x (т. Е. Он выглядит точно так же, как показано выше). Что я должен сделать, чтобы преобразовать это в тот же вид вывода, который я вижу в первом примере? Из того, что я видел до сих пор, кажется, что это юникода и у меня возникают проблемы ...

Соответствующий код из server.py

key = aes.generateRandomKey(keysizes[len(key)%3]) 
encryptedText = aes.encryptData(key, text) 
f = open("serverTest.txt", "w") 
f.write(encryptedText) 
f.close() 
print(encryptedText) 
decryptedText = aes.decryptData(key, encryptedText) 
print(decryptedText) 
conn.sendall(encryptedText) 

Соответствующий код из client.py

cipherText = repr(s.recv(16384))[1:-1] 
s.close() 
cipherFile = raw_input("Enter the filename to save the ciphertext: ") 
print(cipherText) 
f = open(cipherFile, "w") 
f.write(cipherText) 

Редактировать: Чтобы просто сказать, мне нужно отправить эти данные клиенту и отобразить его так же, как и на сервере. Я чувствую, что есть что-то, что я могу сделать с расшифровкой, но все, что я пробовал до сих пор, не работает. В конечном счете, мне придется отправить с клиента обратно на сервер, поэтому я уверен, что исправление здесь также будет работать для этого, если я правильно прочитаю его из файла.

Edit2: При обычной отправке (как в моем коде выше), а затем на клиентской стороне с расширением «строка-побег», я получаю идентичный вывод на терминал с обоих концов. Выходные файлы также выглядят одинаково. Эта проблема близка к разрешению, предполагая, что я могу прочитать это и получить правильные данные, отправленные обратно на сервер для дешифрования.

+0

** НЕ ИСПОЛЬЗОВАТЬ PRINT для двоичных данных **! Если это текстовая печать в порядке, если не сначала закодировать ее на текст (в шестнадцатеричном порядке), а затем распечатать это представление - печать двоичных данных зависит от кодировки терминала и может давать ошибки декодирования в unicode, если кодировка является unicode. В любом случае, если вы и я используем различную кодировку, мы увидим разные представления для одних и тех же данных –

ответ

0

Не уверен, что я полностью понял, что вы делаете, но одно отличие между клиентом и сервером заключается в том, что на клиенте вы получаете repr для строки байтов, тогда как на сервере вы напрямую печатаете строку байтов.

(если я получил вопрос справа) я предлагаю заменить

repr(s.recv(16384))[1:-1] 

с простой

s.recv(16384) 
Смежные вопросы