Как я могу преобразовать 128-битный ключ шифрования AES в строку с помощью Python?

Я пытаюсь преобразовать свой 128-битный ключ AES в байтовый формат в строку, чтобы сохранить его в базе данных. Я пробовал использовать встроенный decode() Python с кодеками ascii и utf-8, но получаю следующие ошибки:

UnicodeDecodeError: кодек ascii не может декодировать байт 0xd9 в позиции 1: порядковый номер не в диапазоне (128)

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

Я использую cryptography.io библиотека для его реализации.


person Hashir Sarwar    schedule 25.06.2020    source источник
comment
В каком формате сейчас ключ? Что вы имеете в виду под этим? Всегда указывайте, что он делает и что вы ожидаете от него.   -  person schroeder    schedule 25.06.2020
comment
@schroeder Я обновил сообщение.   -  person Hashir Sarwar    schedule 25.06.2020
comment
Вы не можете декодировать байты в строку, если байты не представляют строку. В идеале вы должны хранить байты в двоичном столбце базы данных. В качестве альтернативы закодируйте байты во что-то вроде базы 64, чтобы превратить их в безопасную строку ASCII.   -  person deceze♦    schedule 25.06.2020
comment
Спасибо за редактирование. Теперь вы можете подробнее разложить проблему: как преобразовать байт в строку? И это легко найти: stackoverflow.com / questions / 606191 / convert-bytes-to-a-string   -  person schroeder    schedule 25.06.2020
comment
Мой последующий вопрос: почему вы вообще хотите преобразовать в строку? Вы можете хранить байтовые объекты в базах данных ...   -  person schroeder    schedule 25.06.2020


Ответы (1)


Двоичный код часто кодируется в шестнадцатеричном формате или в base64, чтобы обрабатывать его как текст. Модуль Python binascii может использоваться для обоих типов кодирования, как показано ниже:

import random
import binascii

keybinary=random.randrange(0, pow(2,128)).to_bytes(16, byteorder='big')
print('keybinary', keybinary)

keyhex=binascii.b2a_hex(keybinary).decode("utf-8").strip()
print('keyhex', keyhex)

keyb64=binascii.b2a_base64(keybinary).decode("utf-8").strip()
print('keyb64', keyb64)

Это дает:

keybinary b'b3\xfd\xa9\xfe\x11\x86op\x10\x02\x0b\x1bE\x1f\x89'
keyhex 6233fda9fe11866f7010020b1b451f89
keyb64 YjP9qf4Rhm9wEAILG0UfiQ==
person mti2935    schedule 25.06.2020