TypeError: Object of type bytes is not JSON serializable
Столкнулся с проблемой во время написания школьного проекта. Я не могу отправить зашифрованное сообщение пользователя на сервер. Я использую flask и для обмена с сервером мне необходимо это сообщение "затолкать" в json. Проблема в том, что зашифрованное сообщение представляет собой bytes, которые json сериализовать наотрез отказывается. Декодировать сообщение не представляется возможным. Ошибку и код прилагаю
Код который вызывает ошибку:
def crypto(self):
# Генерация ключа RSA
RSA_key = RSA.generate(2048)
# Генерация приватного ключа
pr_key = RSA_key.exportKey(
passphrase=self.code,
pkcs=8,
protection="scryptAndAES128-CBC"
)
with open('key.bin', 'wb') as f:
f.write(pr_key)
# Генерация публичного ключа с помощью приватного
pu_key = RSA_key.public_key().exportKey()
# Отправка публичного ключа на сервер
response = requests.post(
'http://127.0.0.1:5000/change_key',
json={'login': self.sender, 'key': pu_key.hex()}
)
if response.status_code != 200:
msg = QtWidgets.QMessageBox.information(
self,
"Ошибка!",
"Невозможно установить безопасное соединение с сервером"
)
return
def encrypt(self, item, receiver):
# Получение ключа с сервера
try:
self.response = requests.get(
'http://127.0.0.1:5000/send_key',
params={'receiver': receiver}
)
except:
msg = QtWidgets.QMessageBox.information(
self,
"Ошибка!",
"Невозможно установить безопасное соединение с сервером"
)
return
# Преобразование str ответа сервера в ключ RSA
recipient_key = RSA.import_key(bytes.fromhex(self.response.json()['key']), passphrase=self.code)
# Генерация ключа сессии
session_key = get_random_bytes(16)
# Генерация RSA ключа
cipher_rsa = PKCS1_OAEP.new(recipient_key)
# Шифровка данных
item = item.encode('UTF-8')
cipher_aes = AES.new(session_key, AES.MODE_EAX)
ciphertext, tag = cipher_aes.encrypt_and_digest(item)
return [cipher_rsa.encrypt(session_key), cipher_aes.nonce, tag, ciphertext]
def send_message(self):
text = self.message.toPlainText()
if type(self.listWidget.currentItem().text()) == 'NoneType':
msg = QtWidgets.QMessageBox.information(
self,
"Ошибка!",
"Выберите диалог для отправки"
)
return
self.receiver = self.listWidget.currentItem().text()
if not text:
msg = QtWidgets.QMessageBox.information(
self,
"Ошибка!",
"Поле ввода текста не может быть пустым."
)
return
text = self.encrypt(text, self.receiver)
message = {'sender': self.sender, 'receiver': self.receiver, 'text': text}
try:
self.response = requests.post(
'http://127.0.0.1:5000/send',
json=message # Строчка в которой возникает ошибка
)
except:
msg = QtWidgets.QMessageBox.information(
self,
"Внимание!",
"Сервер недоступен, попробуйте позднее."
)
self.message.repaint()
if self.response.status_code == 200:
self.message.setText('')
self.message.repaint()
Пример отправляемых на сервер данных:
[b'p7\x9dhO\xa6\xc8\x8b;\x1cg\xb4\xd8\x97\x8dz\n;\xb4[t\xca\xbe\xeb\x1b\xc3\xa8\x9bq\x90\xb1\xe9\xba}\xb8Va\x04\xa1\xd3\x0bZ\xdaa\xb9}\x93F\xe9\xecQ\xce\xaa\x9e\xbb\x89\xf0\x06S\xa5\\N[K=\xab\x9a\x92l\xd8\xe6hru]\x0c+x!\x9d\xcc{8\x18Y\x14_g\xcej1\x01\t{b(\xb6\xde-\tE!\
xfc\xef\xbdKSy\xecz/\xba\xaf{\x87\xeb\t=\xb5j\x1e\x00g\xcb\xefL\x8a~~g6\xb7F\x84\rJ\xban\xbd\xdf\x05\xb7\x9b\xa6\xe61F\x14\xc7\xb3e\xd2\xf9B\x91\xf0r\xb8\x9dx\x96\xe9:e\x86\xf1\x9b\xc2c\x85\x9c_\xef\xe8\xcf\x92zt)\x8c-D#"\x08~8\x01\xa5)\x9d\x1a\xef\xca\x1d\xbdM!.\x88\x
e4\x86\xeb\x8cJt\xb0\xed\x93\x955\xb1j\xe1.\x9b\xecw\x16\x16P^\x8eR!\x1a\x8e\xd6"\xdaW\x80\xff\xa1\x01`\x81\xa0\xe8R\x1do\ti\xe7@\xa8\xf4\xbe\xbf\xff\xd4\xf1+>\t', b"8(\x90\xb0\xe6\xf4\x85\xff\x9f'\xbbD\xf8\x0e\x84U", b'n\x93\xf0i\xd0\xb6A\x82 JJ\x17\xb6\x15c3', b'\x02
\x9b\xa4/']
Ошибка:
TypeError: Object of type bytes is not JSON serializable