Base64
Base64 — стандарт кодирования двоичных данных при помощи только 64 символов ASCII. Алфавит кодирования содержит текстово-цифровые латинские символы A-Z, a-z и 0-9 (62 знака) и 2 дополнительных символа, зависящих от системы реализации. Каждые 3 исходных байта кодируются 4 символами (увеличение на ¹⁄₃).
Эта система широко используется в электронной почте для представления бинарных файлов в тексте письма (транспортное кодирование).
MIME
В формате электронной почты MIME base64 — это схема, по которой произвольная последовательность байт преобразуется в последовательность печатных ASCII символов. Используются только символы латинского алфавита в верхнем и нижнем регистре — символы (A—Z, a—z), цифры (0—9), и символы «+» и «/», с символом «=» в качестве специального кода суффикса.
Полная спецификация этой формы base64 содержится в RFC 1421 и RFC 2045. Эта схема используется для кодирования последовательности октетов (байт).
Для того, чтобы преобразовать данные в base64, первый байт помещается в самые старшие восемь бит 24-битного буфера, следующий — в средние восемь и третий — в младшие значащие восемь бит. Если кодируется менее, чем три байта, то соответствующие биты буфера устанавливаются в ноль. Далее каждые шесть бит буфера, начиная с самых старших, используются как индексы строки́ «ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/» и её символы, на которые указывают индексы, помещаются в выходную строку. Если кодируются только один или два байта, в результате получаются только первые два или три символа строки, а выходная строка дополняется двумя или одним символами «=». Это предотвращает добавление дополнительных битов к восстановленным данным. Процесс повторяется над оставшимися входными данными.
Например, цитата из "Левиафана" Томаса Гоббса:
- Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.
будучи перекодированной из ASCII в base64, выглядит следующим образом:
TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0 aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1 c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0 aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdl LCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=
В примере, слово Man закодировано как TWFu. Процесс преобразования можно представить в виде следующей таблицы:
Исходный текст | M | a | n | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Коды ASCII | 77 (0x4d) | 97 (0x61) | 110 (0x6e) | |||||||||||||||||||||
Двоичный вид | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
Полученный индекс в Base64 | 19 | 22 | 5 | 46 | ||||||||||||||||||||
Конечный результат в Base64 | T | W | F | u |
Схема соответствия «символ — значение» в Base64
Символ | Значение | Символ | Значение | Символ | Значение | Символ | Значение | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
10 | 2 | 8 | 16 | 10 | 2 | 8 | 16 | 10 | 2 | 8 | 16 | 10 | 2 | 8 | 16 | |||||||
A | 0 | 000000 | 00 | 00 | Q | 16 | 010000 | 20 | 10 | g | 32 | 100000 | 40 | 20 | w | 48 | 110000 | 60 | 30 | |||
B | 1 | 000001 | 01 | 01 | R | 17 | 010001 | 21 | 11 | h | 33 | 100001 | 41 | 21 | x | 49 | 110001 | 61 | 31 | |||
C | 2 | 000010 | 02 | 02 | S | 18 | 010010 | 22 | 12 | i | 34 | 100010 | 42 | 22 | y | 50 | 110010 | 62 | 32 | |||
D | 3 | 000011 | 03 | 03 | T | 19 | 010011 | 23 | 13 | j | 35 | 100011 | 43 | 23 | z | 51 | 110011 | 63 | 33 | |||
E | 4 | 000100 | 04 | 04 | U | 20 | 010100 | 24 | 14 | k | 36 | 100100 | 44 | 24 | 0 | 52 | 110100 | 64 | 34 | |||
F | 5 | 000101 | 05 | 05 | V | 21 | 010101 | 25 | 15 | l | 37 | 100101 | 45 | 25 | 1 | 53 | 110101 | 65 | 35 | |||
G | 6 | 000110 | 06 | 06 | W | 22 | 010110 | 26 | 16 | m | 38 | 100110 | 46 | 26 | 2 | 54 | 110110 | 66 | 36 | |||
H | 7 | 000111 | 07 | 07 | X | 23 | 010111 | 27 | 17 | n | 39 | 100111 | 47 | 27 | 3 | 55 | 110111 | 67 | 37 | |||
I | 8 | 001000 | 10 | 08 | Y | 24 | 011000 | 30 | 18 | o | 40 | 101000 | 50 | 28 | 4 | 56 | 111000 | 70 | 38 | |||
J | 9 | 001001 | 11 | 09 | Z | 25 | 011001 | 31 | 19 | p | 41 | 101001 | 51 | 29 | 5 | 57 | 111001 | 71 | 39 | |||
K | 10 | 001010 | 12 | 0A | a | 26 | 011010 | 32 | 1A | q | 42 | 101010 | 52 | 2A | 6 | 58 | 111010 | 72 | 3A | |||
L | 11 | 001011 | 13 | 0B | b | 27 | 011011 | 33 | 1B | r | 43 | 101011 | 53 | 2B | 7 | 59 | 111011 | 73 | 3B | |||
M | 12 | 001100 | 14 | 0C | c | 28 | 011100 | 34 | 1C | s | 44 | 101100 | 54 | 2C | 8 | 60 | 111100 | 74 | 3C | |||
N | 13 | 001101 | 15 | 0D | d | 29 | 011101 | 35 | 1D | t | 45 | 101101 | 55 | 2D | 9 | 61 | 111101 | 75 | 3D | |||
O | 14 | 001110 | 16 | 0E | e | 30 | 011110 | 36 | 1E | u | 46 | 101110 | 56 | 2E | + | 62 | 111110 | 76 | 3E | |||
P | 15 | 001111 | 17 | 0F | f | 31 | 011111 | 37 | 1F | v | 47 | 101111 | 57 | 2F | / | 63 | 111111 | 77 | 3F |
UTF-7
UTF-7 представляет собой изменённый вариант Base64. Эта схема кодирования используется для файлов UTF-16 как промежуточный формат в MIME. UTF-7 предназначен для использования unicode в e-mail без транспортного кодирования содержимого. Главное отличие этого варианта base64 от MIME в том, что символ «=» не используется для дополнения, так как требуется многократное экранирование этого символа. Вместо этого биты октета дополняются нулями.
Изменённый Base64 стандартизирован по RFC 2152, A Mail-Safe Transformation Format of Unicode.
IRCu
В сервер-сервер протоколе, используемом в IRC и совместимом программном обеспечении, версия base64 используется для кодирования клиент/серверных числовых и двоичных IP адресов. Клиентские и серверные числовые данные имеют фиксированные размеры, которые точно совпадают с количеством знаков base64, тем самым, нет необходимости в дополнении. Двоичные IP-адреса для соответствия расширяются ведущими нулевыми битами. Набор символов незначительно отличается от MIME использованием [] вместо +/.
Применение в веб-приложениях
Также многим приложениям необходимо кодировать двоичные данные для удобства включения в URL, скрытые поля форм, и здесь Base64 удобно не только для компактного представления, но и относительной нечитаемостью для попытки выяснения случайным человеком-наблюдателем природы данных.
Использование URL-кодировщика над стандартом Base64, несмотря на это, неудобно, так как он преобразует символы /
и +
в специальные шестнадцатеричные последовательности. Если позднее эта строка используется вместе с базой данных или через гетерогенные системы, они прекращают работу на символе %
, сгенерированном URL-кодировщиком (потому что символ %
также используется в ANSI SQL как шаблон).
По причине этого существует изменённый Base64 для URL, где не используется заполнение символом =
и символы +
и /
соответственно заменяются на *
и -
, так что использование кодеров/декодеров URL перестаёт быть необходимым и не имеет никакого воздействия на длину закодированного значения, оставляя ту же самую закодированную форму, неповреждённую для использования в реляционных базах данных, веб-формах и идентификаторах объекта вообще. Стандартом Base64-кодирования URL адресов признается вариант, когда символы +
и /
заменяются, соответственно, на -
и _
(RFC 3548, раздел 4).
Другой вариант называется изменённый Base64 для регулярных выражений, использует !
и -
вместо *
и -
, для того, чтобы заменить стандартный Base64 +/
, потому что оба +
и *
могут быть зарезервированы для регулярных выражений (отметим, что []
, используемый выше в IRCu варианте, может не работать в этом контексте).
Имеются другие варианты, которые используют _
и -
или .
и _
, если строка Base64 должна быть использована вместе с идентификаторами для программ, или .
и -
для использования в токенах имён XML (Nmtoken), или _
и :
в более ограниченных идентификаторах XML (Name). В некоторых случаях для URL применяется Base58, который не использует символы +
и /
.
Base58
Для кодирования URL в некоторых системах используется Base58, отличающийся от Base64 отсутствием в конечном тексте символов, которые могут восприниматься человеком неоднозначно. Исключены 0 (ноль), O (заглавная латинская o), I (заглавная латинская i), l (маленькая латинская L). Также исключены символы + (плюс) и / (косая черта), которые при кодировании URL могут приводить к неверной интерпретации адреса.
Radix-64
Radix-64 — разновидность кодирования Base64 двоичных данных в текстовый формат, используемая в PGP. От Base64 отличается тем, что в конец добавляется контрольная сумма в 24 бита.
Операционные системы семейства Unix сохраняют вычисленные с помощью crypt хеши паролей в файл /etc/passwd, используя кодировку B64. Она похожа на radix-64, но суффикс выравнивания «=» не используется и в алфавите небуквенные символы расположены в начале: ./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
.
Другие применения
Существует множество вариантов применения Base64. Например, Thunderbird и Mozilla Suite использовали Base64 для сокрытия паролей в POP3. Base64 может использоваться как метод для сокрытия секретов без издержек на криптографическое управление ключами, однако этот подход является абсолютно небезопасным и не рекомендуется к использованию.[источник не указан 3222 дня]
Сканеры спама, которые не декодируют сообщения в base64, часто пропускают сообщения в Base64, так как они кажутся достаточно случайными или не содержат ключевых слов в тексте Base64, чтобы быть принятыми за спам. Это используют спамеры для обхода основных антиспамовых инструментов.
Данный стандарт применяется для кодирования изображений формата JPEG и PNG для вставки их в электронные книги формата FB2[1].
Примечания
- ↑ Элемент binary — FictionBook . fictionbook.org. Дата обращения: 23 сентября 2019.
Ссылки
- RFC 1421 (Privacy Enhancement for Electronic Internet Mail)
- RFC 2045 (MIME)
- RFC 4648 (Base16, Base32, и Base64 кодирование данных)
- Base64 исходный код на C
- Base64 исходный код на Java
Онлайн кодирование и декодирование
- Только Base64
- Base64 как один из множества форматов
В статье есть список источников, но в этом разделе не хватает сносок. |