Заметки IT инженера
На заре зарождения электронной почты, так давно, что вряд ли кто уже помнит проблема стандартом для кодировки электронной почты была шестибитная кодировка.
Шестибитная кодировка.
Шестибитная кодировка (например — BCD) сделала возможным закодировать в одном байте шестьдесят четыре различных значения, что, как думалось, было вполне достаточно для кодирования алфавитно-цифровых символов, а «лишний» седьмой бит расширял кодировку уже до 128 символов. Однако в скором времени стандартом передачи электрической почты стала восьмибитная кодировка.
Восьмибитная кодировка
Принятие восьмибитной кодировки как стандарта для кодирования принесло массу проблем. К тому времени была создана определенная инфраструктура, которая использовала как раз семибитные кодировки, и холивары разгорелись с новой силой. До они донеслись в виде очередных проблем с «обрезанием восьмого бита» в сообщениях электронной почты. Принятие восьмибитного байта дало двести пятьдесят шесть различных значений для одного байта, что, в свою очередь позволило загнать в одну кодовую таблицу и общепринятые символы (цифры, знаки препинания, латиницу) и символы, скажем кириллицы. Как казалось — это абсолютное удобство, текст можно набирать хоть русскими (кириллическими) буквами, хоть английскими, а если нужно — и для индусских умлаутов место найдется!
Но, как всегда, проблема крылась в деталях. Уже накопленное и работающее программное обеспечение часто был приспособлен для кодировок семибитных, а не как восьмибитных, что приводило к разнообразным проблемам. Одной из таких проблем была проблема, при которой почтовый сервер при передаче письма мог совершенно спокойно обнулить старшие биты в каждом байте письма, что не могло не привести к трагическим проблемам, часто информация просто терялась.
Для временного решения этой проблемы было предложено несколько вариантов. Одним из них было использование кодировки «КОИ-8». Решение, было весьма элегантное — в этой кодировке русские буквы располагались по порядку латинских и отличались от них ровно на тот самый старший бит. Таким образом при обрезании этого бита русская «А» превращалась в латинскую «A», «Б» — в «B» и так далее, сообщение просто транслитерировалось и его все-таки можно было прочитать. Правда, и тут не обошлось без скелета в шкафу — сортировка в русском алфавитном порядке в «КОИ» становилась кошмаром…
А что было делать другим языкам, народам и кодировкам? А бинарные данные? Все равно кодировки с транслитерацией не решали фундаментальную проблему — потерю восьмого бита, потерю части информации. Так родилась кодировка (а точнее — алгоритм) Base64.
Base64.
Работа алгоритма base64 проста — обратимое кодирование, с возможностью восстановления, которое переводит все символы восьмибитной кодовой таблицы в символы, гарантированно сохраняющиеся при передаче данных в любых сетях и между любыми устройствами.
В основе алгоритма лежит сведение трех восьмерок битов (24) к четырем шестеркам (тоже 24) и представление этих шестерок в виде символов ASCII. Таким образом получается обратимое шифрование, единственным недостатком которого будет увеличивающийся при кодировании размер — в соотношении 4:3. Данный алгоритм применяется и сегодня там, где нет возможности гарантировать сохранение информации. Например при кодировании кириллического текста в сообщениях электронной почты, вложений в письмах и так далее.