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

Сегодня мы погрузимся в мир стегоанализа и разберем один из самых элегантных методов обнаружения — атаку «Хи-квадрат» (Chi-Squared). Мы разберем его суть на простом примере, напишем реализацию на Python и посмотрим, как наш инструмент «ChameleonLab» использует этот метод для автоматического анализа файлов.

В чем проблема LSB-стеганографии?

Давайте кратко вспомним самый популярный метод стеганографии — LSB (Least Significant Bit). Его суть в замене наименее значимых бит в байтах, кодирующих цвета пикселей, на биты скрываемого сообщения. Для человеческого глаза такие изменения почти незаметны. Картинка остается прежней, а секрет надежно спрятан.

Но есть нюанс. В обычном, «чистом» изображении значения этих младших бит распределены естественно и слегка хаотично. Где-то больше нулей, где-то — единиц. Когда мы встраиваем данные (например, зашифрованный архив, где количество нулей и единиц примерно одинаково), мы нарушаем эту естественную статистику. Распределение значений LSB становится почти идеально равномерным.

Именно эту аномалию и помогает выявить тест «Хи-квадрат».

Суть метода «Хи-квадрат»: статистика против шпионов

Если говорить просто, тест «Хи-квадрат» — это статистический инструмент, который отвечает на вопрос: «Насколько сильно мои наблюдаемые данные отличаются от тех, которые я ожидал увидеть?»

Давайте на примере. Представьте, что вы подбросили монетку 100 раз. Вы ожидаете увидеть примерно 50 орлов и 50 решек. Если выпало 53 на 47, это нормально. Но если выпало 95 на 5 — это крайне подозрительно. Тест «Хи-квадрат» как раз и позволяет численно выразить эту «подозрительность».

Как это применимо к LSB?

  1. Наблюдаемые значения (Observed): Мы берем все младшие биты (LSB) пикселей изображения и считаем, сколько раз встретился 0 и сколько раз 1.

  2. Ожидаемые значения (Expected): Мы предполагаем, что если бы данные были случайными (как в зашифрованном сообщении), то количество нулей и единиц было бы примерно одинаковым. То есть, общее число пикселей / 2.

  3. Сравнение: Формула «Хи-квадрат» сравнивает эти значения. Если разница между наблюдаемыми и ожидаемыми частотами велика (как в «чистом» фото), результат теста будет одним. Если же разница минимальна (нули и единицы распределены почти 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".  Тест «Хи-квадрат»
Программа "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

Надеюсь, эта статья помогла пролить свет на один из элегантных способов заглянуть за кулисы цифровых тайн. Спасибо за внимание!

Комментарии (0)