Загрузка данных
扩展版 реферат(约为上一版两倍篇幅)
Ниже представлен расширенный текст, который при оформлении по требованиям (Times New Roman 14 пт, интервал 1,5, поля 2 см) составит ориентировочно 40–45 страниц. Это вдвое превышает предыдущий вариант. Материал можно использовать как основу, сократив при необходимости до требуемых 18–20 страниц (убрать разделы, отмеченные как «дополнительно»).
ВВЕДЕНИЕ(扩展版)
Актуальность темы определяется тем фундаментальным обстоятельством, что ни одна криптографическая система не работает непосредственно с «текстом», «изображением» или «звуком». На вход любого алгоритма шифрования — будь то симметричный блочный шифр, асимметричная схема или хеш-функция — поступает последовательность битов. Прежде чем эта последовательность будет сформирована, исходное сообщение должно пройти через этап кодирования, который преобразует его в машинно-представимую форму. На первый взгляд этот этап может показаться сугубо техническим и не заслуживающим отдельного рассмотрения в курсе криптографии. Однако такое впечатление обманчиво.
Во-первых, выбор способа кодирования определяет совместимость компонентов системы. В гетерогенной среде, где отправитель и получатель могут использовать различные операционные системы, языки программирования и версии библиотек, несовпадение кодировок приводит к тому, что одна и та же строка символов превращается в разные байтовые последовательности. При шифровании этих последовательностей одним и тем же ключом будут получены разные шифртексты, что делает невозможной проверку целостности и аутентификации. Более того, неоднозначность интерпретации кодировок может стать основой для атак, при которых злоумышленник конструирует последовательность байтов, по-разному интерпретируемую разными компонентами системы.
Во-вторых, кодирование влияет на эффективность использования канала связи. Смысловое кодирование (сжатие) позволяет сократить объём передаваемых данных, что особенно важно в системах с ограниченной пропускной способностью. Однако, как будет показано в главе 3, совместное применение сжатия и шифрования порождает побочный канал, эксплуатация которого в реальных протоколах (TLS, HTTP) привела к задокументированным атакам, позволившим восстанавливать секретные cookie сессий.
В-третьих, разграничение кодирования и шифрования имеет прямое практическое значение для формирования корректных представлений о безопасности. Строка, закодированная в Base64, не является зашифрованной; она декодируется любым, кто знаком с алгоритмом. Ошибочное восприятие кодирования как защиты может привести к утечке конфиденциальной информации. Представляется, что явное разграничение этих понятий в учебных программах по информационной безопасности является необходимым условием подготовки компетентных специалистов.
Цель работы — исследовать методы символьного и смыслового кодирования информации, определить их роль, место и влияние на безопасность в криптографических системах защиты информации, а также сформулировать практические рекомендации по безопасному сочетанию кодирования и шифрования.
Для достижения поставленной цели необходимо решить следующие задачи:
1. Провести разграничение между кодированием и шифрованием, классифицировать способы кодирования, имеющие отношение к криптографическим системам.
2. Проанализировать символьное кодирование (ASCII, Unicode) как обязательный этап подготовки данных к шифрованию, выявить проблемы совместимости и их криптографические последствия, включая атаки на дополнение (padding oracle).
3. Изучить смысловое кодирование (сжатие данных) на примере кода Хаффмана и арифметического кодирования, определить его взаимодействие с шифрованием и механизм возникновения побочных каналов.
4. Рассмотреть практические примеры применения кодирования в криптографических системах: Base64 как транспортное кодирование криптографических данных, стеганографическое кодирование и цифровые водяные знаки.
5. Проанализировать атаки CRIME и BREACH как примеры эксплуатации смыслового кодирования и рассмотреть существующие методы противодействия.
6. Сформулировать рекомендации по безопасному сочетанию кодирования и шифрования в автоматизированных системах.
Методологическая основа. Работа опирается на учебную литературу по криптографическим методам защиты информации, национальные стандарты (ГОСТ Р 34.12-2015, ГОСТ Р 34.13-2015), а также на научные публикации, освещающие проблемы побочных каналов при совместном применении сжатия и шифрования. Существенный вклад в понимание взаимодействия теории информации и криптографии внесли классические работы К. Шеннона; современные исследования CRIME и BREACH (Rizzo, Duong, Alawatugoda и др.) позволяют проследить, как теоретические предупреждения 2002 года превратились в практические атаки десятилетие спустя .
Структура работы. Реферат состоит из введения, четырёх глав, заключения и списка использованных источников. Первая глава носит теоретический характер и посвящена разграничению кодирования и шифрования. Вторая глава анализирует символьное кодирование и его применение в криптоалгоритмах. Третья глава рассматривает смысловое кодирование, методы сжатия и порождаемые ими побочные каналы. Четвёртая глава посвящена практическим аспектам: транспортному кодированию (Base64), стеганографии и цифровым водяным знакам. В заключении сформулированы основные выводы и рекомендации.
ГЛАВА 1. ТЕОРЕТИЧЕСКИЕ ОСНОВЫ КОДИРОВАНИЯ ИНФОРМАЦИИ(扩展版)
1.1. Понятие кодирования и его отличие от шифрования
В широком смысле кодирование представляет собой процесс преобразования информации из одной формы в другую с целью обеспечения возможности её передачи, хранения или автоматической обработки. В теории информации под кодированием понимают установление взаимно однозначного соответствия между элементами сообщения и кодовыми комбинациями символов некоторого алфавита. При этом предполагается, что получатель располагает той же кодовой таблицей (или алгоритмом), что и отправитель, и восстановление исходного сообщения не требует никакой дополнительной секретной информации .
Шифрование принципиально отличается от кодирования по своей цели и по условиям обратимости. Цель шифрования — обеспечить конфиденциальность сообщения, то есть сделать его содержание недоступным для субъектов, не обладающих секретным ключом. Обратимость шифрования обеспечивается алгоритмом и ключом; без ключа восстановление открытого текста из шифртекста должно быть вычислительно неосуществимым. Таким образом, если кодирование можно уподобить переводу текста на другой язык по общедоступному словарю, то шифрование — это сокрытие смысла с использованием секретного «пароля».
На практике это различие часто размывается. Строка SGVsbG8sIHdvcmxkIQ== выглядит для неподготовленного пользователя как нечто зашифрованное. Однако это всего лишь Base64-кодирование строки «Hello, world!», и любой, кто знаком с данным алгоритмом (или воспользуется онлайн-декодером), восстановит исходный текст за секунды. Аналогично, шестнадцатеричное представление байтов (48 65 6C 6C 6F) также не является шифрованием, а представляет собой лишь иную форму записи тех же данных.
Представляется важным подчеркнуть, что кодирование не обеспечивает ни конфиденциальности, ни целостности, ни аутентификации. Его задача — представление. Криптографические свойства (конфиденциальность, целостность, аутентичность, неотказуемость) обеспечиваются исключительно криптографическими примитивами: шифрами, хеш-функциями, кодами аутентификации сообщений (MAC) и электронными подписями. Смешение этих категорий на практике может приводить к ошибочным решениям, когда кодирование ошибочно принимается за защиту.
1.2. Классификация способов кодирования
Применительно к задачам криптографических систем целесообразно выделять три класса кодирования.
Символьное кодирование сопоставляет каждому символу входного алфавита фиксированную последовательность битов. Исторически первым массовым стандартом стала таблица ASCII (American Standard Code for Information Interchange), утверждённая в качестве федерального стандарта США. В ASCII 128 символов (управляющие коды, цифры, латинские буквы, знаки препинания) представлены 7-битными числами. Расширенные версии (Extended ASCII, кодовые страницы Windows-1251, KOI8-R, ISO 8859-5) используют 8 бит, что даёт 256 комбинаций и позволяет включать национальные алфавиты, включая кириллицу. Символьное кодирование является необходимым этапом, поскольку криптографические алгоритмы оперируют с байтами или блоками битов, но не с «символами» как таковыми.
Смысловое (семантическое) кодирование учитывает статистические свойства сообщения и ставит целью сокращение его объёма за счёт устранения избыточности. В отличие от символьного кодирования, где каждому символу соответствует код фиксированной или переменной длины, но без учёта частоты, смысловое кодирование (сжатие) строит коды на основе распределения вероятностей символов или их последовательностей. Результат сжатия зависит от содержания сообщения: один и тот же алгоритм даст разный коэффициент сжатия для разных текстов. Именно эта зависимость от содержания создаёт предпосылки для побочных каналов, рассматриваемых в главе 3.
Помехоустойчивое кодирование (коды Хэмминга, Рида–Соломона, свёрточные коды) вводит избыточность для обнаружения и исправления ошибок передачи. В данной работе оно подробно не рассматривается, поскольку относится преимущественно к канальному уровню модели OSI и решает иную задачу — не защиту от злоумышленника, а защиту от случайных искажений. Однако следует отметить, что в системах цифровых водяных знаков помехоустойчивое кодирование применяется совместно с криптографическими примитивами для обеспечения устойчивости встраиваемой информации к искажениям (см. раздел 4.2).
Автор полагает, что для криптографических приложений наибольший интерес представляют первые два класса: символьное кодирование обеспечивает «перевод» данных в машинную форму, а смысловое кодирование (сжатие) способно как повышать эффективность шифрования, так и создавать уязвимости. Именно взаимодействие этих двух классов кодирования с криптографическими примитивами и является предметом настоящего исследования.
1.3. Роль кодирования в автоматизированных системах
Автоматизированные системы, будь то веб-приложения, системы электронного документооборота или промышленные сети, обрабатывают данные в цифровой форме. Любой информационный объект — текст, изображение, аудиозапись, видео — должен быть представлен в виде последовательности байтов. Символьное кодирование решает эту задачу для текстовых данных; для мультимедийных данных применяются специализированные форматы (JPEG, MP3, MPEG), которые также можно рассматривать как разновидность смыслового кодирования с потерями.
В защищённых автоматизированных системах кодирование выполняет несколько функций. Во-первых, оно обеспечивает однозначность представления данных: все компоненты системы должны «понимать» одни и те же байтовые последовательности одинаково. Во-вторых, оно обеспечивает эффективность: сжатие позволяет сократить объём передаваемых и хранимых данных. В-третьих, оно обеспечивает совместимость с криптографическими примитивами: данные должны быть представлены в форме, пригодной для блочного шифрования (кратность размеру блока, дополнение) или для асимметричного шифрования (преобразование в целое число).
Однако каждая из этих функций имеет свою цену. Однозначность требует жёсткой фиксации кодировок и процедур обработки ошибок. Эффективность (сжатие) создаёт зависимость длины шифртекста от содержания открытого текста. Совместимость с криптопримитивами требует корректной реализации дополнения, ошибки в котором порождают атаки типа padding oracle. Таким образом, кодирование в защищённых системах не является нейтральным этапом: оно активно взаимодействует с криптографическими механизмами, и это взаимодействие должно проектироваться с учётом возможных атак.
ГЛАВА 2. СИМВОЛЬНОЕ КОДИРОВАНИЕ В КРИПТОГРАФИЧЕСКИХ СИСТЕМАХ(扩展版)
2.1. Двоичное представление и таблица ASCII как базис машинного кодирования
Криптографические преобразования выполняются над битовыми последовательностями. Для блочных шифров, таких как DES (блок 64 бита), AES (блок 128 бит), ГОСТ 28147-89 / «Магма» (блок 64 бита) и «Кузнечик» (блок 128 бит), входное сообщение должно быть разбито на блоки соответствующего размера. Если длина сообщения не кратна размеру блока, применяется дополнение (padding). Стандарт PKCS#7 (RFC 5652) определяет процедуру дополнения, при которой последний неполный блок заполняется байтами, значение каждого из которых равно количеству добавленных байтов. Например, если до полного блока не хватает трёх байтов, добавляются три байта со значением 0x03.
Такая процедура на первый взгляд кажется технической деталью, однако она имеет прямые криптографические последствия. Атаки на дополнение (padding oracle attacks), впервые описанные Блейхенбахером в 1998 году и позже реализованные в атаках POODLE (2014) и Lucky Thirteen (2013), эксплуатируют именно различия в обработке ошибок дополнения для восстановления открытого текста. Если система по-разному реагирует на корректное и некорректное дополнение (например, возвращает разные коды ошибок или разное время ответа), злоумышленник может побайтово восстановить открытый текст, отправляя модифицированные шифртексты и наблюдая за реакцией. Таким образом, корректность символьного кодирования и дополнения является не только вопросом совместимости, но и вопросом стойкости .
Таблица ASCII в её исходном виде определяет 128 символов. Управляющие коды (0–31 и 127) не предназначены для отображения, но активно используются в протоколах (например, CR и LF для разделения строк). Печатные символы (32–126) включают пробел, цифры, латинские буквы обоих регистров и знаки пунктуации. Для криптографических систем важно, что ASCII-представление однозначно определяет байтовую последовательность: символ A всегда соответствует байту 0x41, и это соответствие не зависит от контекста (в отличие от многобайтовых кодировок, где интерпретация байта зависит от его позиции).
2.2. Unicode и проблемы совместимости кодировок
С распространением глобальных коммуникаций 8-битных кодировок стало недостаточно: одновременно использовать кириллицу, латиницу, греческий, арабский и иероглифические письменности в одной кодовой странице невозможно. Unicode решает эту проблему, предоставляя единое пространство кодовых точек (code points), охватывающее более 140 000 символов. Однако Unicode определяет не способ хранения, а лишь сопоставление символов числам. Формы кодирования UTF-8, UTF-16 и UTF-32 определяют, каким образом кодовая точка представляется в виде последовательности байтов.
UTF-8 является доминирующей кодировкой в веб-пространстве. Её ключевое свойство — совместимость с ASCII для символов с кодами 0–127: каждый такой символ занимает ровно один байт с тем же значением, что и в ASCII. Символы с кодами выше 127 занимают от двух до четырёх байтов. UTF-16 использует двух- или четырёхбайтовые последовательности, UTF-32 — фиксированные четырёхбайтовые. Каждая из форм имеет свои преимущества и недостатки: UTF-8 эффективна для текстов на латинице, UTF-16 может быть эффективнее для языков с большой долей символов вне BMP (Basic Multilingual Plane), UTF-32 обеспечивает простоту индексации, но расточительна по памяти.
С точки зрения криптографии проблема заключается в следующем. Одно и то же текстовое сообщение, закодированное в разных формах Unicode, даёт разные байтовые последовательности. Например, строка «Привет» в UTF-8 занимает 12 байтов, в UTF-16 — 12 байтов (но с другим порядком байтов и наличием BOM в некоторых реализациях), в UTF-32 — 24 байта. При шифровании одного и того же текста одним и тем же ключом в разных кодировках будут получены разные шифртексты. Это создаёт проблемы для систем аутентификации сообщений (MAC), где получатель должен восстановить исходную байтовую последовательность для проверки тега, а также для протоколов, в которых разные реализации могут по-разному интерпретировать границы данных.
Более серьёзная проблема — атаки, эксплуатирующие неоднозначность кодировок. Если система принимает данные в одной кодировке, а обрабатывает в другой, злоумышленник может сконструировать последовательность байтов, которая в одной интерпретации является безобидным текстом, а в другой — управляющей последовательностью или частью секрета. Классическим примером является атака переполнения буфера, эксплуатирующая различия между UTF-8 и «расширенным» UTF-8, в котором некоторые байтовые последовательности декодируются в те же символы, что и в стандартном UTF-8, но занимают больше байтов. Представляется, что в защищённых системах кодировка должна быть жёстко зафиксирована на уровне спецификации протокола, а все компоненты должны отклонять данные в неожиданной кодировке, а не пытаться их «угадать».
2.3. Применение символьного кодирования в симметричных алгоритмах шифрования
В симметричных криптосистемах преобразование текста в байты и дополнение до размера блока являются обязательными этапами, предшествующими собственно шифрованию. Стандарт ГОСТ Р 34.13-2015 определяет режимы работы блочных шифров (ECB, CBC, CFB, OFB, CTR, а также режим гаммирования с обратной связью по шифртексту), и для режимов, требующих кратности длины сообщения размеру блока, предусматривает процедуры дополнения. Корректность реализации этих процедур проверяется при сертификации криптографических средств.
Важно понимать, что дополнение не является «просто заполнением»: оно должно быть обратимым и однозначным. Если процедура дополнения допускает неоднозначность (например, позволяет интерпретировать одни и те же байты как данные с дополнением и как данные без дополнения), это создаёт уязвимость. Стандарт PKCS#7 гарантирует однозначность: значение каждого дополняющего байта равно количеству добавленных байтов, и получатель может однозначно определить, сколько байтов было добавлено. Однако реализация этой процедуры должна быть корректной: проверка дополнения должна выполняться в постоянное время (constant-time), чтобы не создавать временного побочного канала.
В режиме ECB (Electronic Codebook) каждый блок шифруется независимо, что делает его уязвимым к атакам на основе повторяющихся блоков (классический пример — изображение «пингвина» Tux, зашифрованное в ECB, в котором сохраняются контуры). В режиме CBC (Cipher Block Chaining) каждый блок открытого текста складывается по модулю два с предыдущим шифртекстом перед шифрованием, что устраняет эту уязвимость, но требует использования вектора инициализации (IV), который должен быть непредсказуемым для каждого сообщения. В режиме CTR (Counter) шифрование сводится к гаммированию: блоки открытого текста складываются с блоками гаммы, генерируемой путём шифрования последовательных значений счётчика. Режим CTR не требует дополнения (поскольку гамма может быть обрезана до длины сообщения), что делает его удобным для потоковых данных.
2.4. Применение символьного кодирования в асимметричных алгоритмах шифрования
В асимметричных криптосистемах, прежде всего в RSA, сообщение перед шифрованием преобразуется в целое число, которое должно быть меньше модуля n. Простейший подход — интерпретировать байтовую строку как большое целое в системе счисления с основанием 256. Однако «голое» шифрование RSA (textbook RSA) небезопасно: оно детерминировано (одинаковые сообщения дают одинаковые шифртексты) и уязвимо к атакам на основе подобранного шифртекста (например, атака малой экспоненты, атака на основе гомоморфных свойств RSA).
Стандарт PKCS#1 (RFC 8017) определяет схемы дополнения OAEP (Optimal Asymmetric Encryption Padding) и PKCS#1 v1.5, которые добавляют к сообщению случайные байты перед возведением в степень. OAEP использует хеш-функцию и маску, чтобы «перемешать» сообщение со случайным填充ом, обеспечивая семантическую безопасность (невозможность отличить шифртексты двух выбранных сообщений). Таким образом, символьное кодирование в RSA неразрывно переплетено с обеспечением безопасности: без корректного дополнения даже математически стойкий алгоритм оказывается уязвимым.
Для схем электронной подписи (RSA-PSS, ГОСТ Р 34.10-2012) ситуация аналогична: сообщение хешируется, хеш-значение кодируется и подписывается. Схема PSS (Probabilistic Signature Scheme) добавляет случайность в процесс формирования подписи, что делает её стойкой к атакам на основе подобранных сообщений.
2.5. Дополнительно: кодирование в протоколах аутентификации
В протоколах аутентификации, таких как Kerberos, кодирование играет важную роль в обеспечении совместимости и безопасности. Сообщения Kerberos кодируются в ASN.1 с использованием правил кодирования DER (Distinguished Encoding Rules), которые обеспечивают однозначное представление структур данных. Однозначность критична: если два разных байтовых представления могут декодироваться в одну и ту же структуру, злоумышленник может использовать это для атаки (например, атака на подпись, при которой подписывается одно представление, а проверяется другое).
Аналогично, в протоколах на основе XML (SAML, WS-Security) применяется канонизация XML (Canonical XML), которая приводит документ к однозначной байтовой форме перед подписью или шифрованием. Без канонизации злоумышленник мог бы изменить незначащие части документа (пробелы, порядок атрибутов) и сохранить действительную подпись, что нарушило бы целостность.
ГЛАВА 3. СМЫСЛОВОЕ (СЕМАНТИЧЕСКОЕ) КОДИРОВАНИЕ И СЖАТИЕ ДАННЫХ(扩展版)
3.1. Сущность смыслового кодирования
Смысловое кодирование, в отличие от символьного, не является простым сопоставлением «символ → код». Оно учитывает статистическую структуру сообщения и ставит целью сокращение объёма данных за счёт устранения избыточности. Клод Шеннон в работе «A Mathematical Theory of Communication» (1948) показал, что минимальное среднее число битов на символ, необходимое для представления сообщения из источника с энтропией H, не может быть меньше H. Смысловое кодирование (сжатие) стремится приблизиться к этому теоретическому пределу .
Ключевое отличие сжатия от шифрования состоит в том, что сжатие не предполагает секретности и обратимо без ключа (для алгоритмов без потерь). Однако результат сжатия зависит от содержания: сообщение с высокой избыточностью сжимается сильнее, чем сообщение с низкой избыточностью (например, уже сжатый файл или случайная последовательность). Эта зависимость от содержания и порождает побочные каналы, рассматриваемые в разделе 3.4.
Сжатие может быть с потерями (lossy) и без потерь (lossless). Сжатие с потерями (JPEG, MP3, MPEG) допускает необратимое отбрасывание части информации, несущественной для восприятия человеком. В криптографических системах сжатие с потерями применяется к мультимедийным данным до шифрования, но не к текстам или ключам. Сжатие без потерь (Huffman, арифметическое, LZ) обеспечивает точное восстановление исходных данных и может применяться к любым данным, включая криптографические.
3.2. Код Хаффмана
Код Хаффмана, предложенный Дэвидом Хаффманом в 1952 году, является одним из наиболее известных алгоритмов префиксного сжатия. Алгоритм строит двоичное дерево на основе частот символов: два узла с наименьшими частотами объединяются в новый узел с суммарной частотой; процесс повторяется до тех пор, пока не останется один корневой узел. Коды символов соответствуют путям от корня к листьям (левый потомок — бит 0, правый — 1). Поскольку ни один код не является префиксом другого, декодирование однозначно и не требует разделителей .
Пример: пусть алфавит состоит из символов A, B, C, D с частотами 0,4; 0,3; 0,2; 0,1 соответственно. Алгоритм Хаффмана может построить дерево, в котором A имеет код 0 (1 бит), B — 10 (2 бита), C — 110 (3 бита), D — 111 (3 бита). Средняя длина кода составит 0,4·1 + 0,3·2 + 0,2·3 + 0,1·3 = 1,9 бита на символ, что меньше, чем при равномерном кодировании (2 бита).
Код Хаффмана оптимален среди всех префиксных кодов для заданного распределения частот: он минимизирует среднюю длину кодового слова. Однако он имеет принципиальное ограничение: длина кода каждого символа должна быть целым числом битов. Если вероятность символа равна 0,9, теоретически оптимальная длина кода составляет около 0,15 бита, но код Хаффмана вынужден использовать минимум 1 бит, что даёт избыточность.
3.3. Арифметическое кодирование
Арифметическое кодирование преодолевает ограничение целочисленной длины кода. Вместо сопоставления каждому символу отдельного кода оно представляет всё сообщение как одно число — дробь в интервале [0, 1). В процессе кодирования интервал последовательно сужается: каждому очередному символу соответствует подинтервал, ширина которого пропорциональна его условной вероятности. По завершении обработки сообщения результат представляется как двоичная дробь, попадающая в финальный интервал .
Пример: пусть кодируется строка «AB» с вероятностями A = 0,6, B = 0,4. Начальный интервал [0, 1). Для A выбирается подинтервал [0, 0,6). Для B внутри этого интервала выбирается подинтервал, соответствующий его условной вероятности: [0,36, 0,6). Любое число из этого интервала (например, 0,5) однозначно декодируется как «AB».
Арифметическое кодирование асимптотически достигает энтропийного предела Шеннона и особенно эффективно для источников с сильно неравномерным распределением вероятностей. Его недостаток — вычислительная сложность и необходимость точной арифметики (или эмуляции таковой), поскольку интервалы могут сужаться до очень малых значений. На практике применяются реализации с ограниченной точностью (например, 32-битные), которые периодически «перемасштабируют» интервал.
3.4. Словарные методы (LZ77, LZ78, deflate)
Словарные методы сжатия заменяют повторяющиеся последовательности ссылками на предыдущие вхождения. LZ77 (Lempel–Ziv, 1977) использует скользящее окно: для каждой позиции в входном потоке ищется наиболее длинное совпадение с последовательностью, уже встречавшейся в предыдущих данных. Вместо самой последовательности передаётся пара (смещение, длина), указывающая на предыдущее вхождение. LZ78 строит явный словарь последовательностей, пополняя его по мере обработки.
Алгоритм deflate (RFC 1951) комбинирует LZ77 и код Хаффмана: сначала выполняется LZ77-сжатие (замена повторов ссылками), затем полученные литералы и ссылки кодируются кодом Хаффмана (с динамически построенными таблицами). Deflate лежит в основе форматов gzip, zip, zlib и широко используется в HTTP-сжатии (Content-Encoding: gzip, deflate).
3.5. Взаимосвязь сжатия и криптографической защиты: атаки CRIME и BREACH
Долгое время парадигма «сжать, затем зашифровать» (compress-then-encrypt) считалась естественной и безопасной: сжатие уменьшает объём данных, снижая нагрузку на канал и вычислительную сложность шифрования, а шифрование обеспечивает конфиденциальность. Однако эта парадигма содержит уязвимость, впервые теоретически описанную Келси в 2002 году и практически продемонстрированную в атаках CRIME (2012) и BREACH (2013) .
Суть уязвимости состоит в следующем. Пусть в одном потоке данных сжимаются и шифруются: (а) секрет (например, cookie сессии), который злоумышленник хочет узнать, и (б) данные, контролируемые злоумышленником (например, параметры запроса). Если злоумышленник может внедрить в запрос строку, совпадающую с началом секрета, то при сжатии эта строка будет «поглощена» секретом (совпадающие последовательности сжимаются эффективнее), и длина сжатого текста уменьшится. Наблюдая за длиной шифртекста (которая после шифрования примерно равна длине сжатого текста плюс накладные расходы), злоумышленник может определить, угадал ли он очередной символ секрета. Итеративно перебирая символы, он восстанавливает секрет целиком.
Атака CRIME (Compression Ratio Info-leak Made Easy) была продемонстрирована на протоколе TLS с включённым сжатием на уровне TLS. Злоумышленник, способный перехватывать трафик (например, в публичной Wi-Fi сети), мог внедрять в запросы данные, содержащие угадываемые символы cookie, и наблюдать за размером ответа. Атака BREACH (Browser Reconnaissance and Exfiltration via Adaptive Compression of Hypertext) эксплуатирует сжатие HTTP-ответов на уровне приложения и оказалась более опасной, поскольку HTTP-сжатие включено на большинстве веб-серверов по умолчанию .
Практической реакцией на CRIME стало отключение сжатия на уровне TLS; в современных версиях TLS (1.3) сжатие не поддерживается. Однако HTTP-сжатие остаётся распространённым, и для защиты от BREACH применяются такие меры, как маскирование секретов (добавление случайных байтов перед секретом в ответе), разделение контекстов сжатия (как в HPACK в HTTP/2, где каждый заголовок сжимается независимо) и ограничение скорости запросов . Исследования также предлагают эвристическое разделение секретов и сжатие с фиксированным словарём как способы сохранить преимущества сжатия, не подвергая секреты риску .
Представляется, что эти примеры имеют важное методологическое значение. Они показывают, что безопасность криптографической системы не сводится к стойкости алгоритма шифрования: способ подготовки данных (в данном случае — смысловое кодирование, сжатие) и порядок операций могут создавать каналы утечки, которых не было бы при ином выборе. Проектировщик защищённой системы обязан анализировать не только криптографические примитивы, но и весь конвейер обработки данных.
3.6. Дополнительно: сжатие и энтропия как источник информации для атакующего
С теоретической точки зрения, уязвимость compress-then-encrypt является следствием того, что сжатие уменьшает энтропию данных, делая её зависимой от содержания. Шифрование, напротив, стремится сделать шифртекст неотличимым от случайной последовательности (максимизировать энтропию с точки зрения атакующего). Если сжатие выполняется до шифрования, длина шифртекста «наследует» зависимость от содержания: более сжимаемые данные дают более короткий шифртекст. Атакующий, наблюдая длину, получает информацию о содержании.
Если бы шифрование выполнялось до сжатия (encrypt-then-compress), шифртекст был бы неотличим от случайного, и сжатие не дало бы никакого эффекта (случайные данные не сжимаются). Поэтому порядок «сжать, затем зашифровать» является единственным практически осмысленным, но именно он и порождает уязвимость. Единственный способ устранить уязвимость, сохранив сжатие, — разорвать зависимость между длиной сжатого текста и содержанием секрета: например, сжимать секрет отдельно от контролируемых атакующим данных (что и делается в HPACK) или добавлять случайный padding, маскирующий длину.
ГЛАВА 4. ПРАКТИЧЕСКИЕ АСПЕКТЫ ВЗАИМОДЕЙСТВИЯ КОДИРОВАНИЯ И КРИПТОГРАФИИ(扩展版)
4.1. Base64 как транспортное кодирование криптографических данных
Base64 определён в RFC 4648 и ряде связанных документов, включая FIPS PUB 81 и более поздние стандарты. Алгоритм обрабатывает входные данные группами по 3 байта (24 бита). Каждая группа разбивается на четыре 6-битных фрагмента; каждый фрагмент используется как индекс в таблице из 64 символов (A–Z, a–z, 0–9, +, /). Если длина входных данных не кратна 3, применяется дополнение нулевыми битами и символом = для обозначения неполных групп.
Base64 не является шифрованием и не обеспечивает никакой конфиденциальности. Его единственная функция — представление произвольных двоичных данных в виде символов, допустимых в текстовых протоколах. В криптографических системах Base64 применяется в нескольких типичных сценариях.
Сертификаты X.509 в формате PEM. Сертификат в DER-кодировке (двоичный) преобразуется в Base64 и заключается между строками -----BEGIN CERTIFICATE----- и -----END CERTIFICATE-----. Это позволяет передавать сертификаты в текстовых сообщениях электронной почты и включать их в конфигурационные файлы. Аналогично кодируются закрытые ключи (хотя их распространение в открытом виде не рекомендуется).
JWT (JSON Web Tokens). Заголовок, полезная нагрузка и подпись JWT кодируются в Base64URL (разновидность Base64 с заменой + на - и / на _ для безопасного использования в URL, а также с опусканием завершающих символов =). Подпись, представляющая собой результат криптографического преобразования (HMAC или асимметричной подписи), также кодируется в Base64URL для включения в токен . Согласно IANA, JWT представляет собой серию base64url-кодированных значений, разделённых точками . В спецификациях, связанных с ГОСТ, JWE (JSON Web Encryption) также использует Base64URL для кодирования шифртекста, тега аутентификации и других компонентов .
Basic Authentication. В схеме HTTP Basic Authentication (RFC 7617) пара «логин:пароль» кодируется в Base64 перед передачей в заголовке Authorization. Важно понимать, что Basic Authentication не обеспечивает защиты без использования TLS: Base64-строка легко декодируется, и учётные данные оказываются доступны любому, кто перехватил соединение. Тем не менее, даже при использовании TLS, Basic Authentication остаётся уязвимой к атакам типа «человек посередине», если сертификат сервера не проверяется должным образом.
Встраивание бинарных данных в JSON/XML. При передаче бинарных данных (например, изображений или шифртекстов) в текстовых форматах JSON или XML применяется Base64-кодирование, поскольку эти форматы не допускают произвольных байтовых последовательностей. Альтернативой является использование шестнадцатеричного представления (hex), но Base64 компактнее (33% увеличения против 100% для hex).
Исследования показывают, что комбинация Base64 с криптографическими алгоритмами позволяет унифицировать обработку текстовых и бинарных данных: Base64 приводит любые данные к текстовой форме, после чего они могут быть зашифрованы алгоритмом, ориентированным на текстовые входы, или переданы по текстовому протоколу. Однако при этом необходимо помнить, что Base64 увеличивает объём данных примерно на 33% (каждые 3 байта превращаются в 4 символа), что может быть существенно для систем с ограниченной пропускной способностью.
4.2. Стеганографическое кодирование и цифровые водяные знаки
Стеганография решает задачу, отличную от шифрования: она скрывает не содержание сообщения, а сам факт его передачи. В компьютерной стеганографии информация встраивается в безобидные на вид контейнеры — изображения, аудиофайлы, видео. Наиболее распространённым методом пространственной области является модификация младших значащих битов (Least Significant Bit, LSB). В 24-битном RGB-изображении каждый пиксель представлен тремя байтами (по одному на каналы красного, зелёного и синего). Изменение младшего бита каждого байта изменяет значение цвета на единицу, что визуально неразличимо для человеческого глаза, но может быть восстановлено при извлечении. Два пикселя RGB-изображения обеспечивают шесть битов для встраивания данных .
LSB-метод обладает высокой пропускной способностью и простотой реализации, но уязвим к шумам, кадрированию и сжатию. Более устойчивые методы используют частотную область: дискретное косинусное преобразование (DCT), дискретное вейвлет-преобразование (DWT), дискретное преобразование Фурье (DFT). В методе DCT изображение разбивается на блоки 8×8, к каждому применяется DCT, и водяной знак встраивается в среднечастотные коэффициенты, которые менее чувствительны к искажениям, чем высокочастотные, но и менее заметны, чем низкочастотные .
Стеганографическое кодирование часто комбинируется с шифрованием: встраиваемое сообщение предварительно шифруется, чтобы даже при обнаружении факта стеганографии злоумышленник не мог прочитать его содержание. Кроме того, перед встраиванием применяется сжатие (смысловое кодирование), поскольку чем меньше объём встраиваемых данных, тем меньше изменений вносится в контейнер и тем ниже риск обнаружения. В некоторых подходах применяется комбинация LSB и DCT: LSB используется для высокой пропускной способности, DCT — для устойчивости к сжатию и другим преобразованиям .
Цифровые водяные знаки (ЦВЗ) представляют собой разновидность стеганографии, ориентированную на защиту авторских прав. В отличие от «классической» стеганографии, где главным требованием является незаметность, ЦВЗ должны обладать устойчивостью (robustness) к определённым преобразованиям: сжатию с потерями (JPEG), кадрированию, изменению масштаба, фильтрации. Для достижения устойчивости применяются методы частотной области. В системах ЦВЗ кодирование и криптография образуют единый комплекс: сам водяной знак может быть зашифрован (чтобы злоумышленник не мог извлечь его и использовать для ложного подтверждения авторства), а для повышения устойчивости к искажениям применяется помехоустойчивое кодирование.
4.3. Дополнительно: кодирование в протоколах электронной почты (MIME)
Протокол SMTP, лежащий в основе электронной почты, исторически был разработан для передачи 7-битного ASCII-текста. Для передачи бинарных вложений (изображений, документов, исполняемых файлов) был разработан стандарт MIME (Multipurpose Internet Mail Extensions). MIME определяет механизм Base64-кодирования для преобразования произвольных двоичных данных в текст, допустимый в SMTP. Заголовок Content-Transfer-Encoding: base64 указывает, что тело сообщения закодировано в Base64 и должно быть декодировано получателем.
С точки зрения безопасности, MIME-кодирование создаёт несколько проблем. Во-первых, антивирусные программы должны декодировать вложения перед проверкой, что создаёт вычислительную нагрузку и потенциальные уязвимости в декодерах. Во-вторых, злоумышленники могут использовать нестандартные или множественные кодирования (например, Base64 внутри Base64), чтобы обойти фильтры. В-третьих, некоторые почтовые клиенты могут автоматически декодировать и отображать вложения, что создаёт риск выполнения вредоносного кода. Эти примеры показывают, что транспортное кодирование, кажущееся безобидным, может становиться вектором атак.
4.4. Дополнительно: кодирование и совместимость в гетерогенных системах
В автоматизированных системах, объединяющих компоненты на разных платформах, проблемы кодирования проявляются особенно остро. Например, при обмене данными между Windows-приложением (использующим кодовую страницу Windows-1251 для кириллицы) и Linux-приложением (использующим UTF-8) без явного указания кодировки возникают искажения текста («кракозябры»). Если эти данные затем шифруются и передаются, получатель не сможет корректно расшифровать и интерпретировать их.
Для решения этой проблемы в протоколах обмена данными (HTTP, JSON, XML) предусмотрено явное указание кодировки. HTTP использует заголовок Content-Type: text/html; charset=utf-8. JSON по умолчанию использует UTF-8 (RFC 8259). XML позволяет указать кодировку в декларации <?xml version="1.0" encoding="UTF-8"?>. Однако даже при наличии явного указания, некоторые реализации могут игнорировать его или интерпретировать неправильно. Представляется, что в защищённых системах должен применяться принцип «строгого кодирования»: все компоненты должны принимать только заранее определённые кодировки и отклонять данные в любой другой кодировке, а не пытаться их «угадать».
ЗАКЛЮЧЕНИЕ(扩展版)
Проведённое исследование позволяет сформулировать следующие выводы, соответствующие поставленным задачам.
Разграничение кодирования и шифрования имеет не только терминологическое, но и практическое значение. Кодирование обратимо без секрета и решает задачу представления информации в форме, пригодной для обработки; шифрование требует ключа и решает задачу обеспечения конфиденциальности. Смешение этих понятий порождает как ложное чувство защищённости (в случае Base64), так и недооценку влияния кодирования на безопасность системы. Автор полагает, что явное разграничение этих категорий должно быть частью базовой подготовки специалистов по информационной безопасности.
Символьное кодирование (ASCII, Unicode) является необходимым этапом подготовки данных к шифрованию. Выбор кодировки и корректность процедур дополнения (padding) влияют на совместимость реализаций и на стойкость системы. Атаки на дополнение (padding oracle) демонстрируют, что технические детали кодирования могут иметь прямые криптографические последствия. В защищённых системах кодировка должна быть зафиксирована на уровне спецификации, а обработка ошибок дополнения — унифицирована и выполнена в постоянное время, чтобы не создавать оракулов.
Смысловое кодирование (сжатие) не является нейтральным по отношению к безопасности. Парадигма compress-then-encrypt, долгое время считавшаяся безопасной, порождает побочный канал, эксплуатация которого в атаках CRIME и BREACH привела к восстановлению секретов (cookie сессий) в реальных веб-приложениях. Практические меры противодействия включают отказ от сжатия на уровне TLS, разделение контекстов сжатия (HPACK в HTTP/2), маскирование секретов и ограничение скорости запросов. Проектировщик защищённой системы обязан анализировать весь конвейер обработки данных, а не только криптографические примитивы.
Практическое применение кодирования в криптографических системах многообразно. Base64 обеспечивает транспортное кодирование бинарных криптографических данных (сертификаты X.509 в PEM, JWT, Basic Auth, вложения MIME), но не защищает их. Стеганографическое кодирование (LSB-метод, DCT, DWT) в сочетании с шифрованием и помехоустойчивым кодированием позволяет скрывать факт передачи информации и защищать авторские права (цифровые водяные знаки). В гетерогенных системах проблемы совместимости кодировок могут создавать уязвимости, если не применяется принцип строгого кодирования.
Рекомендации по безопасному сочетанию кодирования и шифрования:
1. Чётко разграничивать кодирование и шифрование; не полагаться на кодирование как на средство защиты.
2. Фиксировать кодировку на уровне спецификации протокола; отклонять данные в неожиданной кодировке.
3. Реализовывать проверку дополнения в постоянное время и унифицировать сообщения об ошибках.
4. Избегать сжатия секретов вместе с контролируемыми атакующим данными; использовать разделение контекстов сжатия.
5. Применять Base64 только как транспортное кодирование, помня о его обратимости и увеличении объёма.
6. В стеганографических системах комбинировать шифрование, сжатие и помехоустойчивое кодирование для достижения баланса между незаметностью, устойчивостью и пропускной способностью.
Автор полагает, что грамотное сочетание методов кодирования и шифрования, основанное на понимании различий между ними и осознании возможных побочных эффектов, является необходимым условием построения надёжных систем защиты информации в автоматизированных системах. Дальнейшее направление исследований может быть связано с анализом влияния современных форматов сжатия (Brotli, Zstandard) на безопасность протоколов, с разработкой методов сжатия, устойчивых к компрессионным атакам, а также с изучением взаимодействия кодирования и постквантовых криптоалгоритмов.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ(扩展版)
1. Бабаш А. В., Баранова Е. К. Криптографические методы и средства защиты информации : учебник. — Москва : КноРус, 2025. — 224 с. — ISBN 978-5-406-11653-1.
2. Прохорова О. В. Информационная безопасность и защита информации : учебник для СПО. — 5-е изд., стер. — Санкт-Петербург : Лань, 2024. — 124 с. — ISBN 978-5-507-47517-9.
3. ГОСТ Р 34.12-2015. Информационная технология. Криптографическая защита информации. Блочные шифры. — Москва : Стандартинформ, 2016.
4. ГОСТ Р 34.13-2015. Информационная технология. Криптографическая защита информации. Режимы работы блочных шифров. — Москва : Стандартинформ, 2016.
5. Андреянов Н. В., Ильина О. В., Ляшева С. А. Теория информации и кодирования : учебное пособие. — Казань : КНИТУ-КАИ, 2024. — 164 с. — ISBN 978-5-7579-2704-6 .
6. Welsh D. J. A. Codes and Cryptography. — Oxford : Clarendon Press, 1988. — 257 p. — ISBN 0-19-853287-3 .
7. Alawatugoda J., Stebila D., Boyd C. Protecting Encrypted Cookies from Compression Side-Channel Attacks // Cryptology ePrint Archive. — 2014. — Paper 2014/724 .
8. Rizzo J., Duong T. The CRIME Attack // Ekoparty Security Conference. — 2012.
9. Prado A., Rolim G., et al. HTB: A Very Effective Method to Protect Web Servers Against BREACH Attack to HTTPS // IEEE. — 2022 .
10. OWASP. BREACH Attack. — URL: https://owasp.org/www-community/attacks/BREACH (дата обращения: 19.10.2026) .
11. Makarov V., Sadofev A. Using GOST Cryptographic Algorithms for JWT Security : Internet-Draft. — IETF Datatracker, 2026 .
12. IANA. Media Types: application/vc+jwt. — 2024 .
13. CrypticCare: A Strategic Approach to Telemedicine Security Using LSB and DCT Steganography // IEEE. — 2024 .
14. Digital image watermarking using discrete cosine transformation based linear modulation // Journal of Cloud Computing. — 2023. — Vol. 12, № 1 .
15. Alomoush W., Khashan O. A., et al. Digital image watermarking using discrete cosine transformation based linear modulation // Journal of Cloud Computing. — 2023.
16. Enhancing Secure Medical Data Communication Through Integration of LSB and DCT // IEEE. — 2024 .
Примечание: Для достижения объёма в 18–20 страниц (требование задания) из данного расширенного текста можно исключить разделы, помеченные как «дополнительно» (1.3, 2.5, 3.6, 4.3, 4.4), а также сократить некоторые примеры. Для защиты на 7–10 минут достаточно предыдущего варианта презентации (14 слайдов). Если требуется ещё больше текста (например, для полного соответствия объёму при крупном шрифте), можно дополнительно расширить главу 2 разделами о кодировании в конкретных криптографических стандартах (ГОСТ Р 34.10-2012, AES) и главу 4 — примерами из веб-разработки (Content-Encoding, charset в HTTP).