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 групп позволяет заметить аномалии, невидимые для простых тестов.







