Base64
Base64 буквально означает — позиционная система счисления с основанием 64. Здесь 64 — это наибольшая степень двойки (2 6 ), которая может быть представлена с использованием печатных символов ASCII. Эта система широко используется в электронной почте для представления бинарных файлов в тексте письма (транспортное кодирование). Все широко известные варианты, известные под названием Base64, используют символы A-Z, a-z и 0-9, что составляет 62 знака, для недостающих двух знаков в разных системах используются различные символы.
Содержание
Схема соответствия «символ ↔ значение» в Base64
| Символ | Значение | Символ | Значение | Символ | Значение | Символ | Значение | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 10 | 8 | 16 | 10 | 8 | 16 | 10 | 8 | 16 | 10 | 8 | 16 | ||||
| A | 0 | 00 | 00 | Q | 16 | 20 | 10 | g | 32 | 40 | 20 | w | 48 | 60 | 30 |
| B | 1 | 01 | 01 | R | 17 | 21 | 11 | h | 33 | 41 | 21 | x | 49 | 61 | 31 |
| C | 2 | 02 | 02 | S | 18 | 22 | 12 | i | 34 | 42 | 22 | y | 50 | 62 | 32 |
| D | 3 | 03 | 03 | T | 19 | 23 | 13 | j | 35 | 43 | 23 | z | 51 | 63 | 33 |
| E | 4 | 04 | 04 | U | 20 | 24 | 14 | k | 36 | 44 | 24 | 0 | 52 | 64 | 34 |
| F | 5 | 05 | 05 | V | 21 | 25 | 15 | l | 37 | 45 | 25 | 1 | 53 | 65 | 35 |
| G | 6 | 06 | 06 | W | 22 | 26 | 16 | m | 38 | 46 | 26 | 2 | 54 | 66 | 36 |
| H | 7 | 07 | 07 | X | 23 | 27 | 17 | n | 39 | 47 | 27 | 3 | 55 | 67 | 37 |
| I | 8 | 10 | 08 | Y | 24 | 30 | 18 | o | 40 | 50 | 28 | 4 | 56 | 70 | 38 |
| J | 9 | 11 | 09 | Z | 25 | 31 | 19 | p | 41 | 51 | 29 | 5 | 57 | 71 | 39 |
| K | 10 | 12 | 0A | a | 26 | 32 | 1A | q | 42 | 52 | 2A | 6 | 58 | 72 | 3A |
| L | 11 | 13 | 0B | b | 27 | 33 | 1B | r | 43 | 53 | 2B | 7 | 59 | 73 | 3B |
| M | 12 | 14 | 0C | c | 28 | 34 | 1C | s | 44 | 54 | 2C | 8 | 60 | 74 | 3C |
| N | 13 | 15 | 0D | d | 29 | 35 | 1D | t | 45 | 55 | 2D | 9 | 61 | 75 | 3D |
| O | 14 | 16 | 0E | e | 30 | 36 | 1E | u | 46 | 56 | 2E | + | 62 | 76 | 3E |
| P | 15 | 17 | 0F | f | 31 | 37 | 1F | v | 47 | 57 | 2F | / | 63 | 77 | 3F |
В формате электронной почты MIME base64 — это схема, по которой произвольная последовательность байт преобразуется в последовательность печатных ASCII символов. Это определяет MIME как транспортное кодирование содержимого для использования в электронной почте. Используются только символы латинского алфавита в верхнем и нижнем регистре — символы (A—Z, a—z), цифры (0—9), и символы «+» и «/», с символом «=» в качестве специального кода суффикса.
Полная спецификация этой формы base64 содержится в RFC 1421 и RFC 2045. Эта схема используется для кодирования последовательности октетов (байт). Это соответствует определению файлов почти во всех системах. Результирующие закодированные по base64 данные имеют длину, большую оригинальной в соотношении 4:3, и напоминают по виду случайные символы.
Для того, чтобы преобразовать данные в 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.
будучи закодированным в base64 выглядит следующим образом:
UTF-7 представляет собой систему, называемую Изменённый Base64. Эта схема кодирования данных используется для того, чтобы кодировать UTF-16 как промежуточный формат в UTF-7 в печатных ASCII символах. Этот вариант base64 используется в 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 использованием [] вместо +/.
Применение в веб-приложениях
Кодирование Base64 может быть полезно, если в окружении HTTP используется информация, длину которой можно точно определить. Hibernate, библиотека, реализующая базу данных-хранилище для Java-объектов, использует Base64 для того, чтобы закодировать относительно большой идентификатор (как правило, 128-битный UUID) в строку, чтобы использовать его как параметр в HTTP-формах или в запросах HTTP GET URL. Также многим приложениям необходимо кодировать двоичные данные, для удобства включения в URL, скрытые поля форм, и здесь Base64 удобно не только для компактного представления, но и относительной нечитаемостью для попытки выяснения случайным человеком-наблюдателем природы данных.
Использование URL-кодировщика над стандартом Base64, несмотря на это, неудобно, так как он преобразует символы ‘/’ и ‘+’ в специальные шестнадцатеричные последовательности. Если позднее эта строка используется вместе с базой данных или через гетерогенные системы, они прекращают работу на символе ‘%’, сгенерированном URL-кодировщиком (потому что символ ‘%’ также используется в ANSI SQL как шаблон).
По причине этого, существует изменённый Base64 для URL,где не используется заполнение символом ‘=’ и символы ‘+’ и ‘/’ соответственно заменяются на ‘*’ и ‘-‘, так, чтобы использование кодеров/декодеров URL перестаёт быть необходимым и не имеет никакого воздействия на длину закодированного значения, оставляя ту же самую закодированную форму, неповреждённую для использования в реляционных базах данных, веб-формах, и идентификаторах объекта вообще. Стандартом Base64-кодирования URL адресов, признается вариант, когда символы ‘+’ и ‘/’ заменяются, соответственно, на ‘-‘ и ‘_’ (RFC3548, раздел 4).
Другой вариант называется изменённый Base64 для регулярных выражений использует ‘!-‘ вместо ‘*-‘ для того, чтобы заменить стандартный Base64 ‘+/’, потому что оба ‘+’ и ‘*’ могут быть зарезервированы для регулярных выражений (отметим, что ‘[]’ используемый выше в IRCu варианте может не работать в этом контексте).
Имеются другие варианты, которые используют ‘_-‘ или ‘._’, если строка Base64 должна быть использована вместе с идентификаторами для программ, или ‘.-‘ для использования в токенах имён XML (Nmtoken), или ‘_:’ в более ограниченных идентификаторах XML (Name).
Radix-64
Radix-64 — разновидность кодирования Base64 двоичных данных в текстовый формат, используемая в PGP. От Base64 отличается тем, что в конец добавляется контрольная сумма в 24 бита.
Другие применения
Существует множество вариантов применения Base64. Например, Thunderbird и Mozilla использовали Base64 для сокрытия паролей в POP3. Base64 часто используется как рациональный метод в безопасности для скрытия секретов без издержек на криптографическое управление ключами.
Сканеры спама, которые не декодируют сообщения в base64, часто пропускают сообщения в Base64, так как они кажутся достаточно случайными, или не содержат ключевые слова в тексте Base64, чтобы быть принятыми за спам. Это используют спамеры для обхода основных антиспамовых инструментов.
Почему строка в кодировке base64 имеет знак = в конце
Я знаю base64 кодирование и как вычислить base64 кодировка в C#, однако я видел несколько раз, что когда я преобразую строку в base64, есть = в конце.
возникло несколько вопросов:
- тут base64 строка всегда заканчивается = ?
- почему = добавить в конце?
8 ответов
более полный ответ заключается в том, что строка в кодировке base64 не всегда заканчивается = , это закончится только одним или двумя = если они необходимы для заполнения строки до надлежащей длины.
2 — в качестве короткого ответа : 65-й символ (знак» postinfo clearfix»>
последняя последовательность «= = «указывает, что последняя группа содержала только один байт, а» postinfo clearfix»>
- нет.
- для заполнения строки, закодированной в Base64, несколькими символами длиной 4, чтобы ее можно было правильно декодировать.
его определена в RFC 2045 как специальный символ заполнения, если в конце закодированных данных доступно менее 24 бит.
знак равенства ( = ) используется в качестве дополнения в некоторых формах кодировки base64. The статья в Википедии на base64 есть все детали.
Почему строка в кодировке base64 имеет знак = в конце
я знаю что base64 кодировка есть и как рассчитать base64 кодирования в C #, однако я несколько раз видел, что когда я конвертирую строку в base64, появляется = в конце.
Возникло несколько вопросов:
- Имеет ли base64 строка всегда заканчивается на = ?
- Почему = добавляются в конце?
Это не имеет абсолютно никакого отношения к C #. — BoltClock♦
На самом деле это связано с C #, не все языки будут включать =, например, многие библиотеки Perl опускают =, поэтому знание среды, которую использует пользователь, действительно важно. — Jay
Похоже, что в некоторых случаях это делает его менее эффективным методом обфускации, поскольку его вполне можно обнаружить. — dgo
@ user1167442 Base64 не предназначен для обфускации. Он предназначен для передачи двоичных данных (или строк с Unicode и другими специальными символами) в виде строки. — NH.
9 ответы
Более полный ответ заключается в том, что строка в кодировке base64 не всегда закончить = , он закончится только одним или двумя = если от них требуется набить струну до нужной длины.
ответ дан 02 авг.

«Один из случаев, когда требуются символы заполнения, — это объединение нескольких файлов в кодировке Base64». — Андре Пуэль
@ AndréPuel: повторно синхронизируйте один сингл = хватит. Если вы хотите найти границы, всегда должен присутствовать терминатор (и все же нужен только один символ). Вся концепция заполнения Base64 — это просто мозговой трюк . — 6502
Однако эта ссылка совершенно не имеет отношения к base64. — НХ.
Я просто хочу, чтобы была опубликована релевантная и надежная ссылка, которая объясняет о заполнении в base64 эффективно с иллюстрациями и примерами. Настоящая ссылка на википедию абсолютно неактуальна, как @NH. упомянул. — Fr0zenFyr
@ Fr0zenFyr Если вам нужна ссылка, en.wikipedia.org/wiki/Base64#Output_padding довольно хорошо. Но ответ Бадра действительно лучший (просто еще не набрал голосов). — НХ.
В Всегда ли строка base64 заканчивается на =?
В Почему в конце добавляется знак =?
О: В качестве краткого ответа: 65-й символ (знак «=») используется только в качестве дополнения (заполнения) в финальном процессе кодирования сообщения.
У вас не будет знака ‘=’, если ваша строка содержит число, кратное 3 символам, потому что Base64 кодирование занимает каждый три байтов (3 * 8 бит) и представляет их как 4 печатные символы в стандарте ASCII.
Пример:
(A) Если вы хотите закодировать
АБВГДЕЖ <=> [ ABC ] [ DEF ] [ G
Base64 будет работать с первым блоком (производящим 4 символа) и вторым (по мере их завершения). Но к третьему добавит двойную == в выводе, чтобы заполнить 4 необходимых символа. Таким образом, результат будет КУЖД REVG Rw == (без пробелов).
(B) Если вы хотите закодировать
ABCDEFGH <=> [ ABC ] [ DEF ] [ GH
точно так же он добавит только один = в конце вывода получить 4 символа.
Результат будет КУЖД REVG R0g = (без пробелов).
Why does a base64 encoded string have an = sign at the end
I know what base64 encoding is and how to calculate base64 encoding in C#, however I have seen several times that when I convert a string into base64, there is an = at the end.
A few questions came up:
- Does a base64 string always end with = ?
- Why does an = get appended at the end?
![]()
10 Answers 10
Q Does a base64 string always end with = ?
A: No. (the word usb is base64 encoded into dXNi )
Q Why does an = get appended at the end?
A: As a short answer:
The last character ( = sign) is added only as a complement (padding) in the final process of encoding a message with a special number of characters.
You will not have an = sign if your string has a multiple of 3 characters, because Base64 encoding takes each three bytes (a character=1 byte) and represents them as four printable characters in the ASCII standard.
Example:
(a) If you want to encode
ABCDEFG <=> [ ABC ] [ DEF ] [ G ]
Base64 deals with the first block (producing 4 characters) and the second (as they are complete). But for the third, it will add a double == in the output in order to complete the 4 needed characters. Thus, the result will be QUJD REVG Rw== (without spaces).
(b) If you want to encode ABCDEFGH <=> [ ABC ] [ DEF ] [ GH ]
similarly, it will add one = at the end of the output to get 4 characters.
The result will be QUJD REVG R0g= (without spaces).