Python 3 - шифрование чата сокета с помощью PyCrypto дает UnicodeDecodeError

Я пытаюсь настроить чат сокета с шифрованием в Python 3, но при декодировании UTF-8 выдает ошибку.

Вот код:

Клиент:

from Crypto.Cipher import AES 
from Crypto import Random 
import socket, sys
host = 'localhost'
port = 5558
IV = Random.new().read(16) 
c = AES.new('abcd1234efgh5678', AES.MODE_CFB, IV) 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
data = 'hey'.encode('utf-8') # 1
data = c.encrypt(data) # 2
s.sendall(data)

Сервер:

from Crypto.Cipher import AES 
from Crypto import Random 
import socket, sys
host = ''
port = 5558
IV = Random.new().read(16) 
c = AES.new('abcd1234efgh5678', AES.MODE_CFB, IV) 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host,port))
s.listen(10)
sock, addr = s.accept()
data = sock.recv(512)


data = c.decrypt(data) # 1
data = data.decode('utf-8') # 2
print(data)

После запуска этих программ сервер выдает такую ​​ошибку:

UnicodeDecodeError: кодек utf-8 не может декодировать байт 0xa5 в позиции 0: недопустимый начальный байт

Итак, я попытался изменить «utf-8» в коде сервера на «latin-1», и вместо этого он продолжал печатать разные символы Unicode при каждом запуске программы. Затем я поменял местами две строки, отмеченные комментариями, как на клиенте, так и на сервере, и, конечно же, это выдало эту ошибку:

AttributeError: объект 'bytes' не имеет атрибута 'encode'

Я пробовал Google, но все программы, использующие PyCryp, используют Python 2, а не 3. Например. Шифрование и дешифрование с использованием PyCrypto AES 256

http://eli.thegreenplace.net/2010/06/25/aes-encryption-of-files-in-python-with-pycrypto/


person user4884072    schedule 31.07.2015    source источник


Ответы (1)


Помимо того факта, что ваш код выше использует // в качестве комментариев (должно быть #), я запустил приведенный ниже код (удалил все сокеты) и обнаружил ошибку: вы повторно инициализируете IV перед расшифровкой. таким образом вы не получите обратно исходное значение - просто какая-то тарабарщина, которую нельзя декодировать в utf-8.

вам нужно будет отправить IV на сервер (Как передать вектор инициализации AES клиенту для гибридной криптосистемы).

from Crypto.Cipher import AES 
from Crypto import Random 

# CLIENT -----------------------------------------
IV = Random.new().read(16) 
c = AES.new('abcd1234efgh5678', AES.MODE_CFB, IV) 
data = 'hey'.encode('utf-8') #  1
data = c.encrypt(data) #  2


# SERVER -----------------------------------------

# THIS IS WHERE YOUR CODE GOES WRONG!
# IV = Random.new().read(16) 

c = AES.new('abcd1234efgh5678', AES.MODE_CFB, IV) 

data = c.decrypt(data) # 1
data = data.decode('utf-8') # 2
print(data)
person hiro protagonist    schedule 01.08.2015
comment
Спасибо за ответ! Извините за комментарии, языки программирования используют другой синтаксис комментариев, поэтому это немного сбивает с толку. - person user4884072; 02.08.2015