Я пытаюсь настроить чат сокета с шифрованием в 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/