Послать закодированные байты данные более JSON - PullRequest
0 голосов
/ 20 апреля 2020

Я работаю над Python RESTful API, и мне нужно отправить данные в байтовом коде (в частности, данные, зашифрованные с помощью открытого ключа c RSA из пакета rsa ) по сети, через JSON формы.

Вот как это выглядит:

>>> import rsa
>>> pubkey, privkey = rsa.newkeys(512, True) # Create a pair of public/private rsa keys ; 512 is for the example
>>> encStr = rsa.encrypt(b"Test string", pubkey) # Encrypt a bytes object using the public key
>>> encStr
b'r\x10\x03e\xc6*\xa8\xb1\xee\xbd\x18\x0f\x7f\xecz\xcex\xabP~\xb3]\x8f)R\x9b>i\x03\xab-m\x0c\x19\xd7\xa5f$\x07\xc1;X\x0b\xaa2\x99\xa8&\xfc/\x9f\x05!nk\x93%\xc0\xf5\x1d\xf8C\x1fo'

"encStr" - это то, что мне нужно отправить, однако я не могу сказать, какая это кодировка, и документация пакета не упоминает это. Если у вас есть идея, пожалуйста, поделитесь ей:)

>>> encStr.decode("utf-8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec cannot decode byte 0x8e in position 0: invalid start byte
>>> encStr.decode("latin1")
'\x8eM\x96Æ\'zÈZ\x89\x85±\x98Z¯Ûzùæ¯;£zñ8\x9b§Ù\x9dÏ\x8eâ0®\x89ó(*?\x92ªg\x12ôsä\x1d\x96\x19\x82\x19-3\x15SBýh"3òÖß\x91Ô' # This could be it
>>> encStr.decode("latin1").encode("latin1")
b'\x8eM\x96\xc6\'z\xc8Z\x89\x85\xb1\x98Z\xaf\xdbz\xf9\xe6\xaf;\xa3z\xf18\x9b\xa7\xd9\x9d\xcf\x8e\xe20\xae\x89\xf3(*?\x92\xaag\x12\xf4s\xe4\x1d\x96\x19\x82\x19-3\x15SB\xfdh"3\xf2\xd6\xdf\x91\xd4' # Nop, garbage

Поработав некоторое время, я нашел способ получить правильную строку, используя base64.

>>> import base64
>>> b64_encStr = base64.b64encode(encStr)
>>> b64_encStr
b'jk2Wxid6yFqJhbGYWq/bevnmrzujevE4m6fZnc+O4jCuifMoKj+SqmcS9HPkHZYZghktMxVTQv1oIjPy1t+R1A=='
>>> b64_encStr.decode("utf-8")
'jk2Wxid6yFqJhbGYWq/bevnmrzujevE4m6fZnc+O4jCuifMoKj+SqmcS9HPkHZYZghktMxVTQv1oIjPy1t+R1A=='

Теперь я ' Я просто должен отправить это, однако, я хотел бы знать, есть ли более эффективный способ сделать это (более короткая строка; меньше операций, учитывая, что клиент должен кодировать и декодировать сервер, и т. д. c).

Спасибо!

Шон

1 Ответ

0 голосов
/ 20 апреля 2020

Base64 - это относительно эффективный метод отправки байтов в виде текста (6 бит на символ или 8 бит на байт для обычной однобайтовой кодировки символов). Эти байты могут иметь любое значение, например, найденное в зашифрованном тексте. Существуют более эффективные кодировки, такие как basE91 , но они обеспечивают лишь несколько преимуществ по сложности, которую они приносят.

Однако я часто вижу зашифрованный зашифрованный текст, хотя в этом нет необходимости. Файлы, HTTP, сокеты и др. c. все хорошо обрабатывают любые байтовые значения. Если вы хотите использовать его в запросе GET, вам следует использовать base64url вместо обычной кодировки base 64. Часто разработчики кодируют строки без необходимости, чтобы значения можно было легко увидеть в трассах и т. Д., Но в этом случае необходимо кодировать только саму распечатку трассы.

Обратите внимание, что я бы посоветовал вам использовать Заполнение OAEP вместо PKCS # 1 и размер ключа не менее 3072 бит, особенно если вы хотите зашифровать данные, которые передаются, а не шифруются «на месте».

...