Транспортное кодирование
Поскольку системы шифрования данных часто используются для кодирования текстовой
информации : переписки, счетов, платежей электронной коммерции, и при
этом криптосистема должна быть абсолютно прозрачной для пользователя,
то над выходным потоком криптосистемы часто производится
транспортное кодирование, то есть дополнительное
кодирование (не шифрование !) информации исключительно для обеспечения
совместимости с протоколами передачи данных.
Все дело в том, что на выходе криптосистемы байт может
принимать все 256 возможных значений, независимо от того был ли входной
поток текстовой информацией или нет. А при передаче почтовых сообщений
многие системы ориентированы на то, что допустимые значения байтов
текста лежат в более узком диапазоне : все цифры, знаки препинания,
алфавит латиницы плюс, возможно, национального языка. Первые 32 символа
набора ASCII служат для специальных целей. Для того, чтобы они и некоторые
другие служебные символы никогда
не появились в выходном потоке используется транспортное кодирование.
Наиболее простой метод состоит в записи каждого байта двумя шестнадцатиричными
цифрами-символами. Так байт 252 будет записан
двумя символами
'FC';
байт с кодом 26, попадающий на специальный символ
CTRL-Z, будет записан
двумя допустимыми символами '1A'. Но эта схема
очень избыточна : в одном байте передается только 4 бита информации.
На самом деле практически в любой системе коммуникации без проблем
можно передавать около 68 символов (латинский алфавит строчный и прописной,
цифры и знаки препинания). Из этого следует, что вполне реально создать
систему с передачей 6 бит в одном байте
(26<68), то есть
кодировать 3 байта произвольного содержания 4-мя байтами из исключительно
разрешенных (так называемых печатных) символов.
Подобная система была разработана и стандартизирована
на уровне протоколов сети Интернет это система
Base64 (стандарт
RFC1251).
Процесс кодирования преобразует 4 входных символа в виде 24-битной
группы, обрабатывая их слева направо. Эти группы затем рассматриваются
как 4 соединенные 6-битные группы, каждая из которых транслируется
в одиночную цифру алфавита base64. При кодировании base64 входной
поток байтов должен быть упорядочен старшими битами вперед.
Каждая 6-битная группа используется как индекс для массива 64-х
печатных символов. Символ, на который указывает значение индекса, помещается
в выходную строку. Эти символы выбраны так, чтобы быть универсально
представимыми и исключают символы, имеющие специальное значение
(".", CR, LF).
Алфавит Base64
Значение Код Значение Код Значение Код Значение Код
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v заполнитель =
14 O 31 f 48 w
15 P 32 g 49 x
16 Q 33 h 50 y
Выходной поток (закодированные байты) должен иметь длину строк
не более 76 символов. Все признаки перевода строки и другие символы,
отсутствующие в таблице 1, должны быть проигнорированы декодером base64.
Среди данных в Base64 символы, не перечисленные в табл. 1, переводы
строки и т.п. должны говорить об ошибке передачи данных, и, соответственно,
программа-декодер должна оповестить пользователя о ней.
Если в хвосте потока кодируемых данных осталось меньше, чем 24
бита, справа добавляются нулевые биты до образования целого числа 6-битных
групп. А до конца 24-битной группы может оставаться только от 0 до
3-х недостающих
6-битных групп, вместо каждой из которых ставится символ-заполнитель
"=". Поскольку весь входной поток представляет
собой целое число 8-битных
групп (т.е., просто байтных значений), то возможны лишь следующие случаи:
- Входной поток оканчивается ровно 24-битной группой (длина файла кратна 3).
В таком случае выходной поток будет оканчиваться четырьмя символами Base64 без
каких либо дополнительных символов.
- "Хвост" входного потока имеет длину 8 бит. Тогда в конце выходного
кода будут два символа Base64, с добавлением двух символов
"=".
- "Хвост" входного потока имеет длину 16 бит. Тогда в конце выходного будут
стоять три символа Base64 и один символ
"=".
Так как символ "=" является хвостовым
заполнителем, его появление
в теле письма может означать только то, что конец данных достигнут.
Но опираться на поиск символа "=" для
обнаружения конца файла неверно,
так как, если число переданных битов кратно 24, то в выходном файле
не появится ни одного символа "="
Назад | Содержание
| Вперед