Работа с Base64 строками в Python
Тема кодировки является одной из самых сложных тем для понимания, особенно для новичков. В данной статье я постараюсь разобрать алгоритм работы Base64 и показать примеры использования. От вас требуется немного терпения и усидчивости. Приятного чтения!
Контекст проблемы
Вы когда-нибудь получали письмо по e-mail, содержащее PDF или изображение, при попытке открыть которое на экране выводились странные символы? Это могло произойти, если ваш e-mail сервер настроен на обработку только текстовых данных. Файлы с двоичными данными, байты (bytes) которых представляют НЕ-текстовую (non-text) информацию (например картинки), могут быть легко повреждены, если их передавать и обрабатывать в только текстовых (text-only) системах.
Кодировка Base64 позволяет переводить (конвертировать) байты, содержащие двоичную или символьную (текстовую) информацию в ASCII-символы. Подробно с ASCII ознакомиться можно самостоятельно, но идея там простая: каждому литералу ставится в соответствие целое число. Т.к. диапазон значений ограничен латинскими символами + спец символы/управляющие (перевод каретки, табуляция и тд), то все можно ограничить 8 битами == 1 байтом. Т.е. ASCII - такая же кодировка, что и Base64.
P.S. Точнее, ограничить можно и 7 битами, просто добавляют 0 в старший разряд, чтобы добить до 1 байта.
Ниже мы посмотрим как работает кодирование/декодирование в Base64. Будем использовать стандартную библиотеку Python, так что проблем с повторением кода у вас возникнуть не должно. Погнали!
Что такое кодирование Base64
Кодирование / шифрование - процесс, когда в соответствие исходному литералу ставится новое уникальное значение. Обычно это число, причем в любой системе исчисления (СИ).
Кодирование в Base64 - перевод байт в ASCII-символы по определенному правилу. В информатике, основание СИ показывает, как много различных (уникальных) символов могут быть представлены числами. Как видно из имени кодировки - таких значений 64.
Кодировка Base64 содержит:
- 26 ЗАГЛАВНЫХ символа
- 26 строчных символа
- 10 цифр
- "+" и "/" для новых строк (реализации могут отличаться)
ASCII-символы в Python можно посмотреть
Каждый ASCII-символ может быть придставлен целым числом
⚠ Base64 не является алгоритмом шифрования и не должен использоваться в security целях.
Как это работает
Шаги кодирования:
- Получаем ASCII значение для каждого символа в кодируемой строке.
- Вычисляем 8-битный двоичный эквивалент для этих значений.
- Переводим 8-битные куски (chunks) в 6-битные просто перегруппировывая цифры.
- Переводим 6-битные двоичные группы в десятеричную форму.
- Используя Base64 таблицу кодировки, ставим в соответствие каждому числу соотв символ.
Посмотрим, как это выглядит в коде.
Step #1
Step #2
Step #3
Step #4
Полученные значения опять добиваем до 8 бит (в старшие разряды добавляем 0). Проверить можно так
После того, как привели значения к 1 байту, обратно возвращаем в десятичную форму записи
Step #5
Исходя из таблицы, числу 20 соответствует символ "U", 7 ➟ "H" и тд
В результате слово "Python" в кодировке Base64 преобразуется в "UHl0aG9u"
Для чего используется Base64 кодирование?
В компьютерах все данные различных типов представлены 0 и 1. Кроме того, некоторые каналы коммуникаций и приложений не в состоянии понять все принимаемые биты. Это потому, что последовательность 0 и 1 зависит от типа информации, которую они отражают. К примеру, 10110001 должно быть обработано по-разному, в зависимости от того, представляет ли это письмо или картинку.
Чтобы обойти это ограничение, мы можем зашифровать данные в текст, улучшив т.о. возможность корректно передать и обработать данные.
Base64 - популярный метод конвертации двоичных данных в ASCII символы, широко применяемый в большинстве сетевых протоколов и приложений.
В реальном коде, места где применяется Base64:
- почтовые серверы
- html-теги
- файлы конфигураций
- хранение ssh-ключей, подписи запросов
Выяснив, что иногда данные необходимо отправлять в виде текста, чтобы они не были повреждены, посмотрим как в Python обстоят дела с Base64.
Кодирование строк в Python
В Python3 доступен модуль base64 данные, который содержит необходимый функционал.
⚠ Важно! При обратном декодировании необходимо использовать такую же кодировку, с помощью которой исходная строка была закодирована.
Декодирование строк
Декодирование строки Base64 по сути является обратным процессом кодирования. Мы декодируем строку Base64 в байты некодированных данных. Затем мы преобразуем байтоподобный объект в строку.
Кодирование двоичных данных
Теперь попробуем представить бинарный файл (картинку) в виде Base64 строки.
Output:
⚠ Важно! Открывать файл необходимо именно в режиме binary - 'rb'
Восстановление исходного двоичного файла
Заключение
Кодировка Base64 - это популярный метод преобразования данных в различных двоичных форматах в строку символов ASCII. Это полезно при передаче данных через сеть или приложение, которые не могут обрабатывать необработанные двоичные данные, но легко обрабатывают текст.
С помощью Python мы можем использовать модуль base64 для кодирования и декодирования текстовых и двоичных данных Base64.
🖤 Подписывайтесь на мою телегу. Больше кода 🐍 - меньше багов 🪲!
Метод base64.decodebytes принимает байты, а у вас строка и код сломается