Warning: session_name(): Cannot change session name when session is active in /home/stalko/rodina-ru.com/docs/dokuwiki/inc/init.php on line 231
Warning: session_set_cookie_params(): Cannot change session cookie parameters when session is active in /home/stalko/rodina-ru.com/docs/dokuwiki/inc/init.php on line 232
======Base64======
**Base64** буквально означает — [[позиционная-система-счисления|позиционная система счисления]] с основанием 64. Здесь 64 — это число символов в [[алфавит-формальный-язык|алфавите кодирования]], из которого формируется конечный буквенно-цифровой текст на основе латинского алфавита. Число соответствует наибольшей степени двойки (26), которая может быть представлена с использованием печатных символов [[ascii|ASCII]]. Эта система широко используется в [[электронная-почта|электронной почте]] для представления бинарных файлов в тексте письма ([[транспортное-кодирование|транспортное кодирование]]). Все широко известные варианты, известные под названием Base64, используют символы A-Z, a-z и 0-9, что составляет 62 знака, для недостающих двух знаков в разных системах используются различные символы.
=====Схема соответствия «символ — значение» в Base64=====
{|
! rowspan="2"|
Символ
! style="padding-left:0.5em;padding-right:0.5em" colspan="4"|
Значение
| rowspan="18"|
! rowspan="2"|
Символ
! style="padding-left:0.5em;padding-right:0.5em" colspan="4"|
Значение
| rowspan="18"|
! rowspan="2"|
Символ
! style="padding-left:0.5em;padding-right:0.5em" colspan="4"|
Значение
| rowspan="18"|
! rowspan="2"|
Символ
! style="padding-left:0.5em;padding-right:0.5em" colspan="4"|
Значение
|-
!
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
|}
=====MIME=====
В формате электронной почты [[mime|MIME]] **base64** — это схема, по которой произвольная последовательность [[байт]] преобразуется в последовательность печатных [[ascii|ASCII]] символов. Это определяет [[mime|MIME]] как транспортное кодирование содержимого для использования в электронной почте. Используются только символы [[латинский-алфавит|латинского алфавита]] в верхнем и нижнем регистре — символы (A—Z, a—z), цифры (0—9), и символы «+» и «/», с символом «=» в качестве специального кода суффикса.
Полная спецификация этой формы base64 содержится в [[https://tools.ietf.org/html/rfc1421|RFC 1421]] и [[https://tools.ietf.org/html/rfc2045|RFC 2045]]. Эта схема используется для кодирования последовательности [[октет-информатика|октетов]] ([[байт]]). Это соответствует определению файлов почти во всех системах. Результирующие закодированные по base64 данные имеют длину, большую оригинальной на 33 %, а именно, в соотношении 4:3 (каждым 3 байтам оригинального текста соответствуют 4 символа base64), и напоминают по виду случайные символы.
Для того, чтобы преобразовать данные в 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. Процесс преобразования можно представить в виде следующей таблицы:
{|
! |
Исходный текст
| style="text-align:center;" colspan="8"|
**M**
| style="text-align:center;" colspan="8"|
**a**
| style="text-align:center;" colspan="8"|
**n**
|-
! |
Коды ASCII
| style="text-align:center;" colspan="8"|
77 (0x4d)
| style="text-align:center;" colspan="8"|
97 (0x61)
| style="text-align:center;" colspan="8"|
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
| style="text-align:center;" colspan="6"|
19
| style="text-align:center;" colspan="6"|
22
| style="text-align:center;" colspan="6"|
5
| style="text-align:center;" colspan="6"|
46
|-
! |
Конечный результат в Base64
| style="text-align:center;" colspan="6"|
**T**
| style="text-align:center;" colspan="6"|
**W**
| style="text-align:center;" colspan="6"|
**F**
| style="text-align:center;" colspan="6"|
**u**
|}
=====UTF-7=====
[[utf-7|UTF-7]] представляет собой систему, называемую **Изменённый Base64**. Эта схема кодирования данных используется для того, чтобы кодировать [[utf-16|UTF-16]] как промежуточный формат в UTF-7 в печатных [[ascii|ASCII]] символах. Этот вариант base64 используется в MIME. UTF-7 предназначен для того, чтобы позволять использовать [[unicode]] в e-mail без использования разделения транспортного кодирования содержимого. Главное отличие этого варианта base64 от MIME в том, что символ «=» не используется для дополнения, так как требуется многократное экранирование этого символа. Вместо этого биты октета дополняются нулями.
Изменённый Base64 стандартизирован по [[https://tools.ietf.org/html/rfc2152|RFC 2152]], //A Mail-Safe Transformation Format of Unicode//.
=====Base58=====
Для кодирования [[url|URL]] в некоторых системах используется Base58, отличающийся от Base64 отсутствием в конечном тексте символов, которые могут восприниматься человеком неоднозначно. Исключены **0** (ноль), **O** (заглавная латинская **o**), **I** (заглавная латинская **i**), **l** (маленькая латинская **L**). Также исключены символы **+** (плюс) и **/** (косая черта), которые при кодировании [[url|URL]] могут приводить к неверной интерпретации адреса.
=====IRCu=====
В сервер-сервер протоколе, используемом в [[ircu|IRCu]] [[irc-демон|IRC демоном]] и совместимом программном обеспечении, версия base64 используется для кодирования клиент/серверных числовых и двоичных IP адресов. Клиентские и серверные числовые данные имеют фиксированные размеры, которые точно совпадают с количеством знаков base64, тем самым, нет необходимости в дополнении. Двоичные IP-адреса для соответствия расширяются ведущими нулевыми битами. Набор символов незначительно отличается от MIME использованием [] вместо +/.
=====Применение в веб-приложениях=====
Кодирование Base64 может быть полезно, если в окружении HTTP используется информация, длину которой можно точно определить. Также многим приложениям необходимо кодировать двоичные данные для удобства включения в URL, скрытые поля форм, и здесь Base64 удобно не только для компактного представления, но и относительной нечитаемостью для попытки выяснения случайным человеком-наблюдателем природы данных.
Использование URL-кодировщика над стандартом Base64, несмотря на это, неудобно, так как он преобразует символы '/' и '+' в специальные шестнадцатеричные последовательности. Если позднее эта строка используется вместе с базой данных или через гетерогенные системы, они прекращают работу на символе '%', сгенерированном URL-кодировщиком (потому что символ '%' также используется в ANSI SQL как шаблон).
По причине этого существует **изменённый Base64 для URL**,где не используется заполнение символом '=' и символы '+' и '/' соответственно заменяются на '*' и '-', так что использование кодеров/декодеров URL перестаёт быть необходимым и не имеет никакого воздействия на длину закодированного значения, оставляя ту же самую закодированную форму, неповреждённую для использования в реляционных базах данных, веб-формах и идентификаторах объекта вообще. Стандартом Base64-кодирования [[url|URL]] адресов признается вариант, когда символы '+' и '/' заменяются, соответственно, на '-' и '_' ([[https://tools.ietf.org/html/rfc3548|RFC 3548]], раздел 4).
Другой вариант называется **изменённый Base64 для регулярных выражений**, использует '!-' вместо '*-', для того, чтобы заменить стандартный Base64 '+/', потому что оба '+' и '*' могут быть зарезервированы для [[регулярные-выражения|регулярных выражений]] (отметим, что '[]', используемый выше в IRCu варианте, может не работать в этом контексте).
Имеются другие варианты, которые используют '_-' или '._', если строка Base64 должна быть использована вместе с идентификаторами для программ, или '.-' для использования в токенах имён [[xml|XML]] (//Nmtoken//), или '_:' в более ограниченных идентификаторах XML (//Name//). В некоторых случаях для URL применяется [[base58|Base58]], который не использует символы '+/'.
=====Radix-64=====
Radix-64 — разновидность кодирования Base64 двоичных данных в текстовый формат, используемая в [[pgp|PGP]]. От Base64 отличается тем, что в конец добавляется [[контрольная-сумма|контрольная сумма]] в 24 бита.
====Radix-64 применения, не совместимые с Base64====
Операционные системы семейства [[unix|Unix]] сохраняют вычисленные с помощью [[crypt-c|crypt]] хеши паролей в файл [[passwd-утилита|/etc/passwd]] используя кодировку //B64//. Она похожа на radix-64, но суффикс выравнивания «=» не используется и в алфавите небуквенные символы расположены вначале: ''./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz''.
=====Другие применения=====
Существует множество вариантов применения Base64. Например, [[thunderbird|Thunderbird]] и [[mozilla|Mozilla]] использовали Base64 для сокрытия паролей в [[pop3|POP3]]. Base64 часто используется как рациональный метод в безопасности для сокрытия секретов без издержек на криптографическое [[управление-ключами|управление ключами]].
Сканеры [[спам|спама]], которые не декодируют сообщения в base64, часто пропускают сообщения в Base64, так как они кажутся достаточно случайными, или не содержат ключевые слова в тексте Base64, чтобы быть принятыми за спам. Это используют спамеры для обхода основных антиспамовых инструментов.
=====См. также=====
* [[uue|UUE]]
* [[ascii85|Base85]]
=====Ссылки=====
* [[https://tools.ietf.org/html/rfc1421|RFC 1421]] (Privacy Enhancement for Electronic Internet Mail)
* [[https://tools.ietf.org/html/rfc2045|RFC 2045]] (MIME)
* [[https://tools.ietf.org/html/rfc4648|RFC 4648]] (Base16, Base32, и Base64 кодирование данных)
* [[http://base64.sourceforge.net/|Base64 исходный код на C]]
* [[http://iharder.sourceforge.net/base64/|Base64 исходный код на Java]]
* [[http://Base64.ru|Base64 онлайн генератор и декодер]]
\\
{{tag>"Стандарты Интернета" "Форматы данных"}}