Привет, Хабр! В наших прошлых статьях мы рассмотрели общие принципы работы стеганографии и создали многофункциональное приложение «ChameleonLab» для сокрытия данных. Но как насчет обратной задачи? Как понять, что в безобидной на вид картинке спрятано тайное послание?

Сегодня мы погрузимся в мир стегоанализа и разберем один из самых элегантных методов обнаружения — атаку «Хи-квадрат» (Chi-Squared). Мы разберем его суть на простом примере, напишем реализацию на Python и посмотрим, как наш инструмент «ChameleonLab» использует этот метод для автоматического анализа файлов.
В чем проблема LSB-стеганографии?
Давайте кратко вспомним самый популярный метод стеганографии — LSB (Least Significant Bit). Его суть в замене наименее значимых бит в байтах, кодирующих цвета пикселей, на биты скрываемого сообщения. Для человеческого глаза такие изменения почти незаметны. Картинка остается прежней, а секрет надежно спрятан.
Но есть нюанс. В обычном, «чистом» изображении значения этих младших бит распределены естественно и слегка хаотично. Где-то больше нулей, где-то — единиц. Когда мы встраиваем данные (например, зашифрованный архив, где количество нулей и единиц примерно одинаково), мы нарушаем эту естественную статистику. Распределение значений LSB становится почти идеально равномерным.
Именно эту аномалию и помогает выявить тест «Хи-квадрат».
Суть метода «Хи-квадрат»: статистика против шпионов
Если говорить просто, тест «Хи-квадрат» — это статистический инструмент, который отвечает на вопрос: «Насколько сильно мои наблюдаемые данные отличаются от тех, которые я ожидал увидеть?»
Давайте на примере. Представьте, что вы подбросили монетку 100 раз. Вы ожидаете увидеть примерно 50 орлов и 50 решек. Если выпало 53 на 47, это нормально. Но если выпало 95 на 5 — это крайне подозрительно. Тест «Хи-квадрат» как раз и позволяет численно выразить эту «подозрительность».
Как это применимо к LSB?
Наблюдаемые значения (Observed): Мы берем все младшие биты (LSB) пикселей изображения и считаем, сколько раз встретился
0
и сколько раз1
.Ожидаемые значения (Expected): Мы предполагаем, что если бы данные были случайными (как в зашифрованном сообщении), то количество нулей и единиц было бы примерно одинаковым. То есть, общее число пикселей / 2.
Сравнение: Формула «Хи-квадрат» сравнивает эти значения. Если разница между наблюдаемыми и ожидаемыми частотами велика (как в «чистом» фото), результат теста будет одним. Если же разница минимальна (нули и единицы распределены почти 50/50), результат будет совершенно другим, что и укажет на аномалию.
Ключевым результатом теста является p-value — вероятность получить наблюдаемое распределение (или еще более аномальное) при условии, что скрытых данных нет. В нашем случае:
Низкое p-value (например, 0.1): Распределение LSB выглядит естественно и хаотично. Скорее всего, файл «чист».
Высокое p-value (например, 0.95 и выше): Распределение LSB неестественно равномерное. Вероятность того, что такое распределение возникло случайно, крайне мала. Это красный флаг, указывающий на наличие скрытого сообщения.
Реализация на Python
Написать «Хи-квадрат» атаку на Python несложно, особенно с библиотекой SciPy
. Вот функция, которая анализирует изображение, представленное в виде NumPy-массива.
# Из файла analysis_utils.py
import numpy as np
from scipy.stats import chi2
def chi_squared_attack(image: np.ndarray) -> tuple:
"""
Проводит Chi-Squared атаку на LSB-план изображения.
Возвращает: (статистика хи-квадрат, p-value, [(количество нулей, количество единиц)])
"""
# 1. Если изображение цветное, переводим его в градации серого для простоты
if image.ndim == 3:
image = 0.299 * image[:,:,0] + 0.587 * image[:,:,1] + 0.114 * image[:,:,2]
# 2. Извлекаем LSB (младший бит) из каждого пикселя
lsb_bits = (image.flatten().astype(np.uint8)) & 1
# 3. Считаем наблюдаемые частоты
n1 = np.sum(lsb_bits) # Количество единиц
n0 = lsb_bits.size - n1 # Количество нулей
if lsb_bits.size == 0: return 0.0, 1.0, []
# 4. Считаем ожидаемые частоты
expected = lsb_bits.size / 2.0
if expected == 0: return 0.0, 1.0, []
# 5. Вычисляем статистику Хи-квадрат
chi2_stat = ((n0 - expected)**2 / expected) + ((n1 - expected)**2 / expected)
# 6. Получаем p-value. Degrees of freedom (dof) = 1 (т.к. у нас 2 категории: 0 и 1)
p_value = 1.0 - chi2.cdf(chi2_stat, 1)
return chi2_stat, p_value, [(n0, n1)]
Как видите, логика проста: получили LSB, посчитали нули и единицы, сравнили с ожидаемым значением 50/50 и получили p-value.
Как это работает в «ChameleonLan»
Теория и код — это хорошо, но наглядная демонстрация лучше. В нашем приложении «ChameleonLab» тест «Хи-квадрат» является одним из ключевых инструментов на вкладке «Научный анализ».

Когда пользователь загружает оригинальное и стего-изображение, программа автоматически проводит серию тестов, включая «Хи-квадрат». Для наглядности результатов в «ChameleonLab» встроено автоматическое построение графиков «Хи-квадрат». Вместо сухого числа пользователь видит результат, который интуитивно понятен даже без глубоких знаний статистики.
Что представляет собой график:
В модуле page_
research.py
мы используем Matplotlib для построения простого, но информативного bar-чарта:
Высота столбца — это и есть p-value.
Пунктирная линия — это «порог подозрения», который мы установили на уровне 0.95.
Цвет столбца — мгновенная визуальная подсказка: зеленый, если p-value ниже порога (вероятно, файл чист), и красный, если выше (файл очень подозрителен).
Вот как выглядит сравнение «чистого» файла и файла со встроенными данными в нашей программе:
Для оригинального изображения график покажет низкое p-value. Это значит, что распределение бит в файле естественно и не вызывает подозрений.
Для стего-контейнера, в который мы встроили данные, столбец p-value резко подскочит выше отметки 0.95 и станет красным. Это прямой сигнал пользователю: «Внимание, статистика этого файла аномальна, весьма вероятно наличие скрытых данных!».
Кроме того, этот же тест используется в «Пакетном анализе» для быстрой проверки сотен изображений в папке, позволяя автоматически выявлять подозрительные файлы.
А что у конкурентов? Краткий обзор аналогов
Конечно, наша программа не единственная в своем роде. Существует ряд других инструментов для стегоанализа, как с графическим интерфейсом, так и для командной строки.
StegExpose: Один из известных инструментов, также использующий тест «Хи-квадрат» для пакетного анализа изображений на наличие LSB-стеганографии.
Zsteg: Популярный инструмент для командной строки, предназначенный для обнаружения скрытых данных в PNG и BMP файлах. Он проверяет различные методы LSB-встраивания.
Stegsolve: Классическое Java-приложение, которое помогает в ручном анализе, предоставляя инструменты для просмотра бит-планов и применения различных цветовых фильтров к изображениям.
Aletheia: Мощный open-source фреймворк, который использует современные методы машинного обучения для обнаружения даже самых продвинутых техник стеганографии.
В отличие от многих узкоспециализированных утилит, «ChameleonLab» стремится быть комплексным решением «всё в одном»: здесь и инструменты для встраивания, и несколько методов анализа (включая Chi-Squared, RS, DCT), и образовательные визуализаторы, и уникальные мультимедийные функции, — всё это под одной крышей с дружелюбным графическим интерфейсом.
Заключение
Конечно, «Хи-квадрат» — не единственный метод. Он отлично работает против простого LSB-встраивания, но более продвинутые стеганографические алгоритмы могут обходить этот тест. Для борьбы с ними существуют и другие, более сложные методы, такие как RS-анализ и анализ на основе ДКП (DCT), которые, кстати, также реализованы в нашем приложении «ChameleonLab».
Тем не менее, атака «Хи-квадрат» остается прекрасным первым шагом в стегоанализе — она проста в реализации, быстра в исполнении и крайне эффективна против самых распространенных методов сокрытия данных.
Если вы хотите самостоятельно опробовать описанные методы и другие инструменты, последнюю версию программы «ChameleonLab» для Windows и macOS можно скачать на нашем официальном сайте.
А чтобы быть в курсе обновлений, обсуждать новые функции и общаться с единомышленниками, присоединяйтесь к нашему Telegram-каналу: https://t.me/ChameleonLab
Надеюсь, эта статья помогла пролить свет на один из элегантных способов заглянуть за кулисы цифровых тайн. Спасибо за внимание!