Дополнительные строки в base64 кодируют / декодируют в Python? - PullRequest
4 голосов
/ 04 апреля 2020

Я написал эти служебные функции:

import base64

def der2str(der):
    return bin2str( base64.encodebytes(der) )

def str2der(str_):
    return base64.b64decode( str2bin(str_) )

def bin2str(binary):
    return binary.decode('utf8')

def str2bin(str_):
    return str_.encode('utf8')

Я запускаю:

if __name__ == '__main__':
    test = 'MIIEowIBAAKCAQEA6cVU+6GZyr1jaxvJcLEdRb9cicL/4Soe/HqN+gE/UdM5C71aG6HhNSplj1qi\nX8Abffen'
    print(test)
    print(der2str(str2der(test)))

, но вывод:

MIIEowIBAAKCAQEA6cVU+6GZyr1jaxvJcLEdRb9cicL/4Soe/HqN+gE/UdM5C71aG6HhNSplj1qi
X8Abffen
MIIEowIBAAKCAQEA6cVU+6GZyr1jaxvJcLEdRb9cicL/4Soe/HqN+gE/UdM5C71aG6HhNSplj1qi
X8Abffen


Почему я получаю эти дополнительные две новые строки на втором отпечатке?

[EDIT]
В соответствии с помеченным ответом, использование return bin2str( base64.b64encode(der) ) работает нормально, пока входная строка test делает не содержит '\n'.

Если кому-то нужны переводы строк, строка должна заканчиваться на '\n', чтобы утверждение assert(test == der2str(str2der(test))) прошло.

1 Ответ

2 голосов
/ 04 апреля 2020

Документы для base64.encodebytes (s) указывают, что он вставляет символы новой строки

Кодирует байтовоподобный объект s, который может содержать произвольные двоичные данные, и возвращает байты содержащий данные в кодировке base64, с символами новой строки (b '\ n'), вставляемыми после каждых 76 байтов вывода, и гарантией наличия завершающего символа новой строки согласно RF C 2045 (MIME).

Вместо этого вы можете использовать base64.b64encode .

...