Как правильно закодировать ASN.1 структуру (DER) в BASE64?

Рейтинг: 1Ответов: 0Опубликовано: 05.04.2023

Стек: Ubuntu 22.10, Python 3.10, pyderasn.

Формирую ASN.1 структуру в байтах в формате DER, затем для передачи в запросе кодирую эти байты в BASE64. Однако техподдержка сервиса утверждает, что мне нужно проверить используемую кодировку, потому что в результате декодирования моего BASE64 они получают необрабатываемые символы, и просят использовать только кодировку UTF-8.

Вот так я кодирую DER в BASE64 (это пример):

>>> import base64
>>> der = b'0\x81\xa80(\x04 *\xe8p]\x85H\x88\x8f\xb0\\\xb9\x00\xcaX\xaa\xc2\xbeh\x11\xcd\x8a\x91\xf5\xb8\xc1\xb7\x83\x94%=8\xd7\x04\x04\x10\x907\x1e\xa0|\x06\x08*\x85\x03\x07\x01\x01\x06\x01\xa0f0\x1f\x06\x08*\x85\x03\x07\x01\x01\x01\x010\x13\x06\x07*\x85\x03\x02\x02$\x00\x06\x08*\x85\x03\x07\x01\x01\x02\x02\x03C\x00\x04@\x8a)\xca\'\xad\xaa\xa33\x01\x8c\x88\xa0=\xabmJ\xf7\xbfO\xd1c\x86?\x16e\xd5s\xc9\xfcJ>\xe4\x0e#\xef~KN\x02:"\xc7\xaf\xcc\xc2\x8b\'\xca \x1c/\x82\xb5\xac=\xd4EB\xb1\xb0,pyp\x04\x08\t\x01\xbc\x0fg#\x08m'
>>> der_to_b64 = base64.b64encode(der)
>>> der_to_b64
b'MIGoMCgEICrocF2FSIiPsFy5AMpYqsK+aBHNipH1uMG3g5QlPTjXBAQQkDceoHwGCCqFAwcBAQYBoGYwHwYIKoUDBwEBAQEwEwYHKoUDAgIkAAYIKoUDBwEBAgIDQwAEQIopyietqqMzAYyIoD2rbUr3v0/RY4Y/FmXVc8n8Sj7kDiPvfktOAjoix6/MwosnyiAcL4K1rD3URUKxsCxweXAECAkBvA9nIwht'
>>> der_to_b64.decode('utf-8')
 'MIGoMCgEICrocF2FSIiPsFy5AMpYqsK+aBHNipH1uMG3g5QlPTjXBAQQkDceoHwGCCqFAwcBAQYBoGYwHwYIKoUDBwEBAQEwEwYHKoUDAgIkAAYIKoUDBwEBAgIDQwAEQIopyietqqMzAYyIoD2rbUr3v0/RY4Y/FmXVc8n8Sj7kDiPvfktOAjoix6/MwosnyiAcL4K1rD3URUKxsCxweXAECAkBvA9nIwht'
>>> b64_decode = base64.b64decode(der_to_b64)
>>> b64_decode
b'0\x81\xa80(\x04 *\xe8p]\x85H\x88\x8f\xb0\\\xb9\x00\xcaX\xaa\xc2\xbeh\x11\xcd\x8a\x91\xf5\xb8\xc1\xb7\x83\x94%=8\xd7\x04\x04\x10\x907\x1e\xa0|\x06\x08*\x85\x03\x07\x01\x01\x06\x01\xa0f0\x1f\x06\x08*\x85\x03\x07\x01\x01\x01\x010\x13\x06\x07*\x85\x03\x02\x02$\x00\x06\x08*\x85\x03\x07\x01\x01\x02\x02\x03C\x00\x04@\x8a)\xca\'\xad\xaa\xa33\x01\x8c\x88\xa0=\xabmJ\xf7\xbfO\xd1c\x86?\x16e\xd5s\xc9\xfcJ>\xe4\x0e#\xef~KN\x02:"\xc7\xaf\xcc\xc2\x8b\'\xca \x1c/\x82\xb5\xac=\xd4EB\xb1\xb0,pyp\x04\x08\t\x01\xbc\x0fg#\x08m'
>>> b64_decode == der
True

Но у них в результате декода моего BASE64 получается что-то вот такое:

0€0( 3T÷ÃañÑŸœŸQQ¡Ùå'È$K›Ýî¥)„Ž$qk+ÁÙ x*… c0*…0*…$ *…C @ǯsÅËÑ Û,"æûwp&¹RxüòWr¯nŽn¢ŠâU8¡üÆS–8^fĪœZ¢Yø¬ÓBSB«¢¶6øQ$ÐâjŽ6N

Попробовал исследовать это на Windows 10. Открыл при помощи Notepad++, и кодировка стояла ANSI. Поменял кодировку на UTF-8, текст более-менее стал похож на строку байтов (как в моём примере выше), но я не смог её преобразовать в ASN.1 структуру...

Что я делаю не так (в коде)? Я не могу понять, почему мой BASE64 декодируется у них в такую абракадабру?

Ответы

Ответов пока нет.