OpenSSL — как средство для расшифровки Base64

Начало.

В процессе написания очередного скрипта для настройки сервиса отправки почтового сообщения по средствам sms, возникла необходимость в расшифровке тела письма зашифрованного Base64.

Немного истории.

На заре зарождения электронной почты, так давно, что вряд ли кто уже помнит проблема стандартом для кодировки электронной почты была шестибитная кодировка.

Шестибитная кодировка.

Шестибитная кодировка (например — BCD) сделала возможным закодировать в одном байте шестьдесят четыре различных значения, что, как думалось, было вполне достаточно для кодирования алфавитно-цифровых символов, а «лишний» седьмой бит расширял кодировку уже до 128 символов. Однако в скором времени стандартом передачи электрической почты стала восьмибитная кодировка.

Восьмибитная кодировка

Принятие восьмибитной кодировки как стандарта для кодирования принесло массу проблем. К тому времени была создана определенная инфраструктура, которая использовала как раз семибитные кодировки, и холивары разгорелись с новой силой. До они донеслись в виде очередных проблем с «обрезанием восьмого бита» в сообщениях электронной почты. Принятие восьмибитного байта дало двести пятьдесят шесть различных значений для одного байта, что, в свою очередь позволило загнать в одну кодовую таблицу и общепринятые символы (цифры, знаки препинания, латиницу) и символы, скажем кириллицы. Как казалось — это абсолютное удобство, текст можно набирать хоть русскими (кириллическими) буквами, хоть английскими, а если нужно — и для индусских умлаутов место найдется!

Но, как всегда, проблема крылась в деталях. Уже накопленное и работающее программное обеспечение часто был приспособлен для кодировок семибитных, а не как восьмибитных, что приводило к разнообразным проблемам. Одной из таких проблем была проблема, при которой почтовый сервер при передаче письма мог совершенно спокойно обнулить старшие биты в каждом байте письма, что не могло не привести к трагическим проблемам, часто информация просто терялась.

Для временного решения этой проблемы было предложено несколько вариантов. Одним из них было использование кодировки «КОИ-8». Решение, было весьма элегантное — в этой кодировке русские буквы располагались по порядку латинских и отличались от них ровно на тот самый старший бит. Таким образом при обрезании этого бита русская «А» превращалась в латинскую «A», «Б» — в «B» и так далее, сообщение просто транслитерировалось и его все-таки можно было прочитать. Правда, и тут не обошлось без скелета в шкафу — сортировка в русском алфавитном порядке в «КОИ» становилась кошмаром…

А что было делать другим языкам, народам и кодировкам? А бинарные данные? Все равно кодировки с транслитерацией не решали фундаментальную проблему — потерю восьмого бита, потерю части информации. Так родилась кодировка (а точнее — алгоритм) Base64.

Base64.

Работа алгоритма base64 проста — обратимое кодирование, с возможностью восстановления, которое переводит все символы восьмибитной кодовой таблицы в символы, гарантированно сохраняющиеся при передаче данных в любых сетях и между любыми устройствами.

В основе алгоритма лежит сведение трех восьмерок битов (24) к четырем шестеркам (тоже 24) и представление этих шестерок в виде символов ASCII. Таким образом получается обратимое шифрование, единственным недостатком которого будет увеличивающийся при кодировании размер — в соотношении 4:3. Данный алгоритм применяется и сегодня там, где нет возможности гарантировать сохранение информации. Например при кодировании кириллического текста в сообщениях электронной почты, вложений в письмах и так далее.

OpenSSL как средство для декодирования сообщения электронной почты.

Возвращаясь к моей задаче, мне как раз нужно было декодировать сообщение и получить текст, отправляемый русскими (кириллическими) буквами. Одним из решений которое можно было использовать является утилита base64. Но я столкнулся с трудностью, для моей старой Suse Linux такого пакета не оказалось. Что же делать? Переезжать на новую систему в пятницу 13-го не было никакого желания, так же как и обновлять существующую, которая к тому же снята с поддержки. И решение нашлось! OpenSLL, да-да именно он. Он тоже умеет расшифровывать base64.

openssl base64

Попробуем зашифровать самую знаменитую фразу Hello world:

# openssl base64 -e <<< ‘Hello world’
SGVsbG8gd29ybGQK

openssl base64 encode

А теперь расшифруем полученный хэш:

# openssl base64 -d <<< SGVsbG8gd29ybGQK
Hello world

openssl base64 dencode

Теперь используяпол ученые знания, вы с легкостью сможете расшифровать тело любого сообщения электронной почты, зашифрованного в Base64.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *