RS-Анализ: Продвинутое обнаружение скрытых данных

RS-Анализ: Продвинутое обнаружение скрытых данных

Статистические методы обнаружения, такие как анализ гистограммы (Хи-квадрат), часто дают сбой, если скрытое сообщение короткое или распределено по изображению слишком хитро. В таких случаях на помощь приходит RS-Анализ (Regular-Singular Analysis). Этот метод считается одним из самых надежных для детектирования классической LSB-стеганографии в цветных и черно-белых изображениях.


Принцип работы: Гладкость и Шум

RS-анализ не просто смотрит на цвета пикселей, он анализирует группы пикселей и их взаимосвязи (пространственную корреляцию). Изображение разбивается на небольшие блоки (например, 2x2 пикселя).

К каждому блоку применяется специальная «маска» изменений (например, инверсия LSB). В зависимости от того, как меняется «шумность» (вариация) блока после применения маски, блоки классифицируются на три типа:

  • Regular (R): Шумность блока увеличивается после изменения (типично для чистых изображений).
  • Singular (S): Шумность блока уменьшается (аномалия).
  • Unusable (U): Шумность не меняется.

В чистом изображении количество R-блоков значительно превышает количество S-блоков ($R > S$). Однако, по мере того как мы заполняем изображение скрытыми данными (рандомизируя LSB), разница между количеством R и S блоков сокращается. При 100% заполнении шумом $R \approx S$. Анализируя эти пропорции, RS-анализ может с высокой точностью предсказать длину скрытого сообщения.


Пример кода: Классификация блоков (Python)

В этом примере мы реализуем функцию подсчета групп R и S, которая является сердцем RS-анализа.

import numpy as np
from PIL import Image

def calculate_smoothness(block):
    """Вычисляет 'шумность' (вариацию) блока пикселей."""
    # Простая метрика: сумма модулей разностей соседних элементов
    return np.sum(np.abs(np.diff(block)))

def flip_lsb(val):
    """Инвертирует LSB значения (функция F1 в RS-анализе)."""
    # Если четное (2k) -> 2k+1, Если нечетное (2k+1) -> 2k
    # Это эквивалентно XOR с 1
    return val ^ 1

def rs_analysis_core(image_path, mask=[1, 0, 0, 1]):
    """
    Выполняет классификацию блоков для RS-анализа.
    mask: Маска изменений, где 1 означает инверсию LSB.
    """
    try:
        img = (image_path).convert('L') # Для простоты берем ч/б (Luminance)
        pixels = np.array(img, dtype=np.int16)
        h, w = pixels.shape
        
        # Разбиваем на группы (например, по горизонтали, по 4 пикселя)
        # Размер маски определяет размер группы
        group_size = len(mask)
        
        count_R = 0
        count_S = 0
        count_U = 0
        
        # Проходим по изображению с шагом group_size
        for y in range(h):
            for x in range(0, w - group_size, group_size):
                original_block = pixels[y, x:x+group_size]
                
                # Создаем модифицированный блок, применяя маску
                modified_block = original_block.copy()
                for i in range(group_size):
                    if mask[i] == 1:
                        modified_block[i] = flip_lsb(modified_block[i])
                
                # Считаем гладкость (вариацию) до и после
                f_original = calculate_smoothness(original_block)
                f_modified = calculate_smoothness(modified_block)
                
                if f_modified > f_original:
                    count_R += 1 # Regular: шум вырос
                elif f_modified < f_original:
                    count_S += 1 # Singular: шум уменьшился (инвертировался)
                else:
                    count_U += 1 # Unusable: без изменений
                    
        total_groups = count_R + count_S + count_U
        
        return {
            "Regular (%)": (count_R / total_groups) * 100,
            "Singular (%)": (count_S / total_groups) * 100,
            "Unusable (%)": (count_U / total_groups) * 100,
            "Verdict": "Подозрение на стего" if abs(count_R - count_S) < 5 else "Вероятно чисто"
        }
        
    except Exception as e:
        return f"Ошибка: {e}"

# # Пример использования
# # Для чистого изображения R должно быть сильно больше S.
# # Для заполненного изображения R и S сближаются.
# result = rs_analysis_core('test_image.png')
# print(result)

Полный RS-анализ требует проведения этой процедуры с разными масками (положительной и отрицательной) и построения квадратного уравнения для точного вычисления длины сообщения. Однако даже этот базовый подсчет R и S групп позволяет заметить аномалии, невидимые для простых тестов.

Поделиться: