Base64 почему появляются символы

от admin

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, есть = в конце.

возникло несколько вопросов:

  1. тут base64 строка всегда заканчивается = ?
  2. почему = добавить в конце?

8 ответов

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

2 — в качестве короткого ответа : 65-й символ (знак» postinfo clearfix»>

последняя последовательность «= = «указывает, что последняя группа содержала только один байт, а» postinfo clearfix»>

  1. нет.
  2. для заполнения строки, закодированной в Base64, несколькими символами длиной 4, чтобы ее можно было правильно декодировать.

его определена в RFC 2045 как специальный символ заполнения, если в конце закодированных данных доступно менее 24 бит.

знак равенства ( = ) используется в качестве дополнения в некоторых формах кодировки base64. The статья в Википедии на base64 есть все детали.

Почему строка в кодировке base64 имеет знак = в конце

я знаю что base64 кодировка есть и как рассчитать base64 кодирования в C #, однако я несколько раз видел, что когда я конвертирую строку в base64, появляется = в конце.

Возникло несколько вопросов:

  1. Имеет ли base64 строка всегда заканчивается на = ?
  2. Почему = добавляются в конце?

Это не имеет абсолютно никакого отношения к 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:

  1. Does a base64 string always end with = ?
  2. Why does an = get appended at the end?

santosh singh's user avatar

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).

Похожие статьи