ASCII, Unicode и представление текста
Разберитесь, как текст превращается в байты и почему кодировка символов важна в криптографическом контексте
«ASCII, Unicode и представление текста» — бесплатный урок Cryptology Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Cryptology Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Cryptology Academy содержит 4 уроков всего.
ASCII как 7-битная кодировка
ASCII (американский стандартный код для обмена информацией), стандартизированный в 1963 году, кодирует 128 символов с помощью 7 бит (значения 0–127). Он охватывает английский алфавит (прописные и строчные буквы), цифры, знаки пунктуации и управляющие символы.
ASCII был разработан для английского языка и американского телекоммуникационного оборудования. Для своей цели он подходил хорошо, но принципиально не подходил для любого языка, кроме английского.
Управляющие символы в ASCII
Первые 32 символа ASCII (0–31) и DEL (127) являются управляющими символами. Изначально они предназначались для управления телетайпными аппаратами: LF (перевод строки, 10), CR (возврат каретки, 13), BEL (звуковой сигнал, 7), TAB (9), ESC (27).
В криптографических контекстах управляющие символы могут вызывать проблемы. Нулевой байт (0x00) преждевременно завершает строки C, а символ DEL или ESC может быть интерпретирован эмуляторами терминала.
Расширенный ASCII и его проблемы
Разные страны создавали собственные расширения ASCII, используя 8-й бит (значения 128–255), что привело к появлению сотен несовместимых кодировок: ISO-8859-1 (Latin-1) для Западной Европы, KOI-8R для русского языка, Big5 для китайского языка.
Документ, сохраненный в одной кодировке, при открытии с другой выглядит как бессмыслица. Отсутствие универсального стандарта создавало серьезные трудности для международной разработки программного обеспечения на протяжении 1980-х и 1990-х годов.
Unicode как универсальный набор символов
Unicode был создан для предоставления единого универсального набора символов, охватывающего все системы письменности человечества. В настоящее время он определяет более 149 000 символов, охватывающих 161 письменность, включая исторические письменности и символы.
Unicode отделяет идентичность символа (кодовую точку, например U+0041 для "A") от кодировки (способа хранения этой кодовой точки в байтах). Благодаря такому разделению один и тот же символ можно представить в нескольких форматах кодирования.
Кодировка переменной длины UTF-8
UTF-8 кодирует кодовые точки Unicode с помощью от 1 до 4 байтов. Символы ASCII (от U+0000 до U+007F) используют ровно 1 байт, идентичный их значениям ASCII, благодаря чему UTF-8 обратно совместима с ASCII.
Для символов от U+0080 до U+07FF используются 2 байта. Для символов от U+0800 до U+FFFF используются 3 байта (это охватывает большинство распространенных письменностей, включая китайскую, японскую и корейскую). Для U+10000 и выше используются 4 байта.
UTF-16 и UTF-32
UTF-16 использует 2 байта для наиболее распространенных символов (базовая многоязычная плоскость, от U+0000 до U+FFFF) и 4 байта (суррогатные пары) для символов за пределами U+FFFF. Эта кодировка используется внутри Windows и Java.
UTF-32 использует ровно 4 байта на каждую кодовую точку, поэтому имеет фиксированную длину и позволяет легко обращаться к символам по их позиции, но неэкономно расходует место для текста, состоящего преимущественно из ASCII. Она используется в некоторых внутренних представлениях для быстрого произвольного доступа.
Маркер порядка байтов (BOM)
Маркер порядка байтов (BOM) — это символ Unicode U+FEFF, помещаемый в начало файла для указания порядка байтов и кодировки. В UTF-16 он отличает порядок от старшего байта к младшему (FE FF) от порядка от младшего байта к старшему (FF FE).
В UTF-8 маркер BOM (EF BB BF) не нужен, поскольку у UTF-8 нет проблем с порядком байтов, однако некоторые программы Windows все равно добавляют его. Это вызывает проблемы в криптографических приложениях, где BOM воспринимается как данные, а не как маркер.
Почему кодировка важна в криптографии
Криптографические хеш-функции и коды аутентификации сообщений (MAC) работают с последовательностями байтов, а не с абстрактными символами. Одна и та же строка "café" по-разному кодируется в UTF-8 (4 байта: 63 61 66 C3 A9) и Latin-1 (4 байта: 63 61 66 E9).
Если две системы вычисляют хеш одной и той же строки, используя разные кодировки, они получат разные хеши, и аутентификация завершится неудачно. В криптографических протоколах кодировка должна быть указана явно, чтобы обеспечить совместимость.
Эмодзи в UTF-8
Эмодзи — это символы Unicode из дополнительной многоязычной плоскости. Эмодзи "Улыбающееся лицо" (U+1F600) кодируется в UTF-8 4 байтами: F0 9F 98 80.
В контексте безопасности эмодзи и полноширинные символы Unicode использовались в гомографных атаках, когда URL вроде "xn--pple-43d.com" (похожий на "apple.com") обманом заставляет пользователей перейти на вредоносный сайт.
Нормализация Unicode и криптография
Некоторые символы можно представить в нескольких формах Unicode. «e с акутом» может быть представлена как U+00E9 (предварительно составленный символ) или как U+0065 U+0301 (e, за которым следует комбинируемый акцент, то есть разложенная форма). Визуально они выглядят одинаково, но имеют разные байтовые представления.
Криптографические системы, которые не нормализуют Unicode перед вычислением хеша, могут получать разные хеши для визуально одинаковых строк. Перед выполнением криптографических операций над текстом обычно рекомендуется нормализация NFKC.
Выбор правильной кодировки для криптографии
При реализации криптографических систем выбор кодировки является критически важным решением и должен быть задокументирован. Перед хешированием пароли следует кодировать в UTF-8. Для полей протокола кодировка должна быть указана в документах спецификации.
Несовместимость из-за несоответствия кодировок — распространенный источник ошибок в криптографических системах. Две реализации одного протокола могут получать разные результаты аутентификации, если по-разному кодируют строки.
Тест по кодировке UTF-8
Проверьте свое понимание кодировки UTF-8.
Основные выводы: кодирование текста
ASCII охватывает 128 символов и использует 7 бит. Unicode предоставляет универсальное пространство кодовых точек для всех письменностей человечества. UTF-8 кодирует Unicode с помощью от 1 до 4 байтов, причем ASCII является его 1-байтовым подмножеством.
В криптографии кодировка важна, поскольку хеш-функции работают с байтами. Один и тот же текст в разных кодировках дает разные хеши. Перед выполнением криптографических операций над текстом необходима нормализация Unicode.
Часто задаваемые вопросы
Урок «ASCII, Unicode и представление текста» бесплатный?
Да — полный текст урока «ASCII, Unicode и представление текста» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Cryptology Academy, подпишись на CoddyKit PRO. Курс Cryptology Academy содержит 4 уроков всего.
Чему я научусь в уроке «ASCII, Unicode и представление текста»?
Разберитесь, как текст превращается в байты и почему кодировка символов важна в криптографическом контексте Ты практикуешь Cryptology Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Cryptology Academy?
Предыдущий опыт не требуется. Cryptology Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «ASCII, Unicode и представление текста»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Cryptology Academy?
Да. Каждый урок Cryptology Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Кодирование Base64: как это работает
- ASCII, Unicode и представление текста
- Шестнадцатеричное представление криптографических данных
- Кодирование, шифрование и хеширование